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


相关推荐

  • Python2.3-原理之语句和语法

    Python2.3-原理之语句和语法

    2021年9月7日
    55
  • linux系统下载官网下载_msdn官网下载系统

    linux系统下载官网下载_msdn官网下载系统CentOS-6.9-x86_64-bin-DVD1.isohttp://archive.kernel.org/centos-vault/6.9/isos/x86_64/CentOS-6.9-x86_

    2022年8月6日
    6
  • mysql联合索引的底层原理_聚集索引原理

    mysql联合索引的底层原理_聚集索引原理面试中被问到了联合索引,突然就涉及到了知识盲区,对不起,我只知道B+树,B树,哈希索引,聚簇索引,非聚簇索引,联合索引的原理?。。对不起涉及到了我的知识盲区了。这里对联合索引做一个总结,联合索引,顾名思义,普通的索引我们只会对单个字段去构建索引,又分为主键索引和辅助索引,那么联合索引就是对多个字段去构建索引,从而在某些场景下提升提升查询效率。最左匹配原则提到联合索引,不得不提的就是最左匹配原则所谓最左原则指的就是如果你的SQL语句中用到了联合索引中的最左边…

    2025年9月16日
    6
  • 常见电商项目的数据库表设计(MySQL版)

    常见电商项目的数据库表设计(MySQL版)常见电商项目的数据库表设计(MySQL版)简介:目的:电商常用功能模块的数据库设计常见问题的数据库解决方案环境:MySQL5.7图形客户端,SQLyogLinux模块:用户:注册、登陆商品:浏览、管理订单:生成、管理仓配:库存、管理电商实例数据库结构设计:电商项目用户模块用户表涉及的实体改进1:第三范式:将依赖传递的列分离出来。比如:登录…

    2022年6月20日
    32
  • 域名ssl证书怎么弄_nginx配置https证书

    域名ssl证书怎么弄_nginx配置https证书越来越多的第三方接入需要使用https了,很多时候不止到证书到那里免费申请,申请后怎么配置。免费证书和收费证书主要的差别有几点免费证书收费证书支持绑定域名数少支持绑定域名数多无保险费用有保险费用一年需要更换两年或三年可选颁发机构少更多的颁发机构证书免费申请的几个大平台阿里云腾讯云…

    2022年10月1日
    1
  • 算法:记忆化搜索「建议收藏」

    算法:记忆化搜索「建议收藏」概述记忆化搜索是一种典型的空间换时间的思想。记忆化搜索的典型应用场景是可能经过不同路径转移到相同状态的dfs问题。更明确地说,当我们需要在有层次结构的图(不是树,即当前层的不同节点可能转移到下一层的相同节点)中自上而下地进行dfs搜索时,大概率我们都可以通过记忆化搜索的技巧降低时间复杂度。例子:青蛙过河题目描述一只青蛙想要过河。假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表stones(用单

    2022年7月26日
    13

发表回复

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

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