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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DSP6678入门必看「建议收藏」

    DSP6678入门必看「建议收藏」DSPC6000系列入门必看如何选择外部时钟?DSP的内部指令周期较高,外部晶振的主频不够,因此DSP大多数片内均有PLL。但每个系列不尽相同。TMS320C62xx:PLL可以×1,×4,×6,×7,×8,×9,×10和×11,因此外部主频可以为11.8MHz-300MHz。TMS320C67xx:PLL可以×1和×4,因此外部主频可以为12.5MHz-230MHz。TMS320C64…

    2022年5月18日
    110
  • rs232接口与rs485接口区别_rs485和rj45区别

    rs232接口与rs485接口区别_rs485和rj45区别原文地址:https://www.sohu.com/a/244903033_649673通讯端口都是串口,在以下几个方面有区别:1、通讯距离RS232口最大通讯距离是15米,而RS422/485最大通讯距离是1200米。2、所连接设备个RS232只能连接一个设备,而RS485可以连接多个设备。3、端口的定义RS232是标准接口,为D形9针头,所连接设备的接口的信号定义是一样的,其信号定义如下:而RS422/RS485为非标准接口,一般为15针串行接口(也有使用9针接口的),每

    2022年9月17日
    0
  • JPS算法_系统结构是什么

    JPS算法_系统结构是什么在A*算法的基础上,推导JPS算法的规则、特点

    2022年9月20日
    0
  • gitlab cicd配置

    gitlab cicd配置简介以前代码更新之后,我们需要手动将代码拉到测试服务器上,运行验收通过之后,再在生产环境重新弄一遍,一两个服务还算轻松,如果涉及到的服务很多的话,每一个服务都需要这样来几遍,这是一个很头疼了,为了解决这个问题,我们引入了比较简单易懂的自动化部署工具,这也是gitlab自带的CI工具gitlab-runner,该工具解决了多环境多服务手动部署繁琐问题,用自动化脚本代替人工部署,我们不需要手…

    2022年6月9日
    82
  • 停止 uwsgi_终止代码invalid kernel handle

    停止 uwsgi_终止代码invalid kernel handlesudopkill-fuwsgi-9

    2022年9月3日
    2
  • Velocity常用语法「建议收藏」

    Velocity常用语法「建议收藏」一、基本语法1、"#"用来标识Velocity的脚本语句,包括#set、#if、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;如:#if($info.imgs)<imgsrc="$info.imgs"border=0>#else<imgsrc="noPhoto.jpg">#end2、"$"用来标识一个对象(或理解

    2022年9月1日
    2

发表回复

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

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