MySQL_插入更新 ON DUPLICATE KEY UPDATE

MySQL_插入更新 ON DUPLICATE KEY UPDATEMySQL_插入更新 ON DUPLICATE KEY UPDATE

大家好,又见面了,我是你们的朋友全栈君。

逻辑上我们需要怎么写:

$result = mysql_query('select * from xxx where id = 1');
$row = mysql_fetch_assoc($result);
if($row){ 
   
mysql_query('update ...');
}else{ 
   
mysql_query('insert ...');
}

但是这样写有两个问题?

1、效率太差,每次执行都要执行2个sql
2、高并发的情况下数据会出问题,不能保证原子性

ON DUPLICATE KEY UPDATE 可以达到以下目的:

向数据库中插入一条记录:若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。否则插入一条新的记录。

注意事项:

1,若多个索引都冲突,则只有一条记录被修改。具体原因→
2,插入返回1,修给返回2,具体原因→

事例源码:

$data = [
	'id'	=> 1,
	'name'	=> 'aa',
	'age'	=> 12,
];
$tabe = 'table_name';
public function batchUpdateInsert($data,$table)
    { 
   
        if (!is_array($data) || !$table) { 
   
            return false;
        }
        $key = array_keys($data[0]);
        $field = '('.implode(',',array_values($key)).')';

        $bindField = '';
        foreach($key as $val){ 
   
            $bindField .= $val.'=VALUES('.$val.'),';
        }
        $bindField = trim($bindField,',');

        $value = '';
        foreach($data as $val){ 
   
            $value .= '('.implode(',',array_map(function( $v ){ 
     return "'".$v."'";},array_values($val))).'),';

        }
        $value = trim($value,',');
        $sql = sprintf("INSERT INTO %s %s VALUES %s ON DUPLICATE KEY UPDATE %s", $table, $field, $value, $bindField);
        return $sql;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105863.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《滕王阁序》在古文中处于什么水平?

    《滕王阁序》在古文中处于什么水平?杜工部 戏为六绝句 其三 纵使卢王操翰墨 劣于汉魏近风骚 龙文虎脊皆君驭 历块过都见尔曹 如果把现存的古来文章分个一二三等 这篇文章无疑在第一等 可是这样下来 第一等也太多了 怎么也得上千篇了 如果还要在这个第一等上千篇文章分个上中下 滕王阁序大概出于一等中的水平 上中下按照 1 3 6 的比例 1000 篇文章 一等上文章 100 篇 一等中 300 篇 一等下 600 篇 滕王阁序 就是一等中这 300 篇的序列 这是比较客观的了 其实 滕王阁序 在这个位置 并不是对这篇文章的贬低 恰恰相反 它反映了我国古代文学

    2025年9月21日
    5
  • 点击轮播图片左右button,实现轮播效果

    点击轮播图片左右button,实现轮播效果

    2022年1月24日
    55
  • 硬盘分区显示磁盘上没有足够的空间完成此操作_您选择的分区可用空间不足

    硬盘分区显示磁盘上没有足够的空间完成此操作_您选择的分区可用空间不足在新的预装windows7的品牌机上,工作人员一般将磁盘分为C、D两个分区。但往往造成C盘有很大一部分的空间没办法分出来,而分出来的部分空间又不能和后面的磁盘合并,甚至出现无法新建简单卷的操作,即点

    2022年8月4日
    6
  • DedeCMS+ucenter+uchome同步登录退出整合教程

    DedeCMS+ucenter+uchome同步登录退出整合教程

    2021年8月18日
    57
  • 导入pfx证书

    导入pfx证书打开MicrsoftManangeConsole,你可以按住“Windows+R”,并输入mmc,打开MMC界面。一:添加管理单元(snap-in)从File主菜单中选择“Add/RemoveSnap-in”,打开“AddorRemoveSnap-ins”对话框从左侧的“Availablesnap-ins”列表中选择Certificates,点击”Add>”,打开“Certificatessnap-in”对话框,选择“Computeraccount”:选择snap-

    2022年6月7日
    96
  • 理解 Spring ApplicationListener

    理解 Spring ApplicationListener      ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。 如果容器中有一个ApplicationListenerBean,每当ApplicationContext发布ApplicationEvent时,ApplicationListen…

    2025年7月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号