Mysql on duplicate key update用法及优缺点

Mysql on duplicate key update用法及优缺点

大家好,又见面了,我是全栈君。

在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新,

  在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPLICATE KEY UPDATE一步就可以完成(Mysql独有的语法)。

ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql

在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。

说通俗点就是数据库中存在某个记录时,执行这个语句会更新,而不存在这条记录时,就会插入。

注意点:

  因为这是个插入语句,所以不能加where条件。

  如果是插入操作,受到影响行的值为1;如果更新操作,受到影响行的值为2;如果更新的数据和已有的数据一样(就相当于没变,所有值保持不变),受到影响的行的值为0。

该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,并且表中已经存在了一条记录值为1,

下面两个语句会有相同的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3)  
  ON DUPLICATE KEY UPDATE c=c+1;  
  
UPDATE table SET c=c+1 WHERE a=1;

ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。

再现一个例子:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)  
      ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); 

表中将更改(增加或修改)两条记录。

项目中数据的操作有时候会令人头大,遇到一个需求:

需要将数据从A数据库的a数据表同步到B数据库的b数据表中(ab表结构相同,但不是主从关系。。。just同步过去)

第一次同步过去,b表为空,同步很简单。

但是当a表中的某些数据更新且增加了新数据之后,再想让两个表同步就有些麻烦了。(如果把b表清空,重新同步,数据量过大的话耗费的时间太长,不是一个好办法)

想着能不能按照时间段来做更新,这段时间内有新数据了,就插入数据,有数据更新了就更新数据。先说下我的思路:

步骤:

  1.首先我从a表取出某一时间段的数据(分段更新)

  2.往b表内放数据,根据主键判断b表是否已经有此条记录,没有此数据则插入,有了记录则对比数据是否一样,一样则不做更改,不一样就做更新操作。

此时使用该语句可以满足需要,但是要注意几个问题:

  • 更新的内容中unique key或者primary key最好保证一个,不然不能保证语句执行正确(有任意一个unique key重复就会走更新,当然如果更新的语句中在表中也有重复校验的字段,那么也不会更新成功而导致报错,只有当该条语句没有任何一个unique key重复才会插入新记录);尽量不对存在多个唯一键的table使用该语句,避免可能导致数据错乱。

  • 在有可能有并发事务执行的insert 语句情况下不使用该语句,可能导致产生death lock。

  • 如果数据表id是自动递增的不建议使用该语句;id不连续,如果前面更新的比较多,新增的下一条会相应跳跃的更大。

  • 该语句是mysql独有的语法,如果可能会设计到其他数据库语言跨库要谨慎使用。

产生death lock原理

insert … on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。

如果有两个事务并发的执行同样的语句,那么就会产生death lock,如:

Mysql on duplicate key update用法及优缺点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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

相关推荐

  • phpstorm 3.3激活码【在线破解激活】

    phpstorm 3.3激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
  • GridView控件

    GridView控件

    2021年11月28日
  • 用tushare获取股票历史数据

    用tushare获取股票历史数据我们运用python进行量化分析的时候需要载入证券数据,tushare为我们提供了证券市场数据接口。tushare是以新浪财经、腾讯财经、上交所数据、深交所数据为基础提供的Python接口。安装方法为pipinstalltushare也可以到tushare的官网去下载,并且官网上有接口各个调用函数的详细说明http://tushare.org/index.html#id5

    2022年6月24日
  • 京东云免费SLL正式(HTTPS)免费申请及nginx配置

    京东云免费SLL正式(HTTPS)免费申请及nginx配置京东云免费ssl证书申请及配置一、证书申请1、京东云地址:[https://www.jdcloud.com/](https://www.jdcloud.com/)2、登录京东云后可在左上角云服务中搜索:SSL3、选择搜索出的选项中的SSL数字证书,进入SSL证书管理平台;4、在左侧选择申购管理,然后点击申购证书5、在申购SSL证书界面,按下图选择对应的证书类型,即可购买;6、订单确认,立即支付即可完成证书的申请二、证书配置1、完善域名信息1、在申购管理中,找到刚才购买的证书,点击完善信息;2、在下面的输入

    2022年10月14日
  • eclipse如何导入java文件_xml表格

    eclipse如何导入java文件_xml表格代码快速实现xml转换为Excel(xml转excel通用类-java-完成代码可作工具使用)用代码实现xml文件/数据转换为excel文件。(java)—-何潮背景:最近项目要做导出功能,但导出的数据对象类型实在太多了,一个个去实现;实在是没心情去做。于是———-意义:快速实现数据导出为什么是xmltoexcel?因为项目中可以直接使用xml数据。所以就选择xm…

    2022年8月22日
  • 《可复制的领导力》思维导图读书笔记,提升职场竞争力[通俗易懂]

    《可复制的领导力》思维导图读书笔记,提升职场竞争力[通俗易懂]身在职场中的我们,很多人都为缺乏领导力而头痛,羡慕那些成功领导者所具备的领导力。但几乎所有人都认为领导力是一种感觉,是一门很深奥的学问,是经过许多年去锻炼出来的,是学不会的。王侯将相,宁有种乎?小编现在想告诉大家,其实领导力的方法与技巧,每个人都可以通过学习来掌握,不论是看书也好,看视频也罢。都是可以的。即便你不是领导,也同样需要领导力,因为这可以在社会彰显你的价值。下面通过MindMaster思维导图走进樊登老师的著作里,去学习和掌握领导力的一些方法与技巧。(注:本图由MindMaster导图

    2022年6月17日

发表回复

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

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