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


相关推荐

  • 零基础学习JAVA其实并不难!不相信?进来看看你就知道了

    零基础学习JAVA其实并不难!不相信?进来看看你就知道了其实Java并没有想象中的那么难,首先想要入这个行,要做好一个心理准备,那就是你想走远点,就得不间断的去学习,去汲取知识,前期不能怕辛苦,不要闲下来就打LOL、吃鸡、王者农药,有空就得多看看各种开源项目的代码,API的设计方式,各大网站的设计架构,理解各个环节的作用。补齐自己的知识视野。  当然这个行业也并不是什么门槛都没有,不要再私信我初中生、高中生、中专生能不能学习Java了。反正我个人是认为不可行的,或许你可以去问问其他大神?或许他们会觉得可以的。  下图是我更新过的自学表,分别分为4个阶段。按

    2022年7月7日
    40
  • js正则 手机号_正则表达式 手机号

    js正则 手机号_正则表达式 手机号RegExp对象正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。//匹配手机号//varres=/^[1][3,4,5,6.7,8,9][0-9]{9}$///letnum=18045216903//console.log(res.test(num))//匹配身份证号码//varres=/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)///varn=’5203

    2025年11月13日
    6
  • pledge to_debezium采集 oracle

    pledge to_debezium采集 oracle下面我们来看两个范例,一个是使用BULKCOLLECT的,一个没有:范例1、使用多次循环来检索并显示数据。范例2、一次性获取数据,然后再循环显示。下面是一些有关BULKCOLLECT的建议:1、从Oracle9i开始,你都可以在静态SQL和动态SQL中使用BULKCOLLECT。2、你可以在任何地方的SELECTINTO,FETCHINTO,和RETURNINGINTO子句中使用BUL…

    2025年5月25日
    3
  • ip addr命令详解_linux more命令详解

    ip addr命令详解_linux more命令详解(我意识到这是一个古老的问题,但谷歌把我带到了这里,因为我试图找出确切的变化和替换以及它们如何不同).我相信替换和更改都用于修改现有地址.考虑:ipaddradd192.168.1.10/32devdummy0这让我:32:dummy0:mtu1500qdiscnoqueuestateUNKNOWNgroupdefaultlink/ether5a:ec:58:4f:…

    2022年7月28日
    16
  • 【C语言】让你不再害怕指针——C指针详解(经典,非常详细)

    因排版过于粗糙学习详情转至:https://blog.csdn.net/qq_41035588/article/details/97010039前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总…

    2022年4月6日
    31
  • linux之lvm分区扩容[通俗易懂]

    linux之lvm分区扩容[通俗易懂]以下步骤的前提为磁盘lvm分区1、加入新硬盘2、分区PV(physicalvolume)即物理卷,就是物理磁盘,可以通过fdisk-l查看操作系统有几块硬盘VG(volumegroup)即卷组,就是一组物理磁盘的组合,里面可以有一块硬盘也可以有多块硬盘LV(logicalvolume)及逻辑卷,就是在VG(指定的物理磁盘组)里面划分出来的可以说成是PV就是硬盘…

    2022年6月20日
    241

发表回复

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

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