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

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

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

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

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

步骤:

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

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

第一步很好做,第二步就有点繁琐了,就想着偷懒,网上查了下发现mysql有个语句能满足我的需求。

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

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

用法 : insert into tablename(field1,field2,field3,......) values(value1,value2,value3,....) on duplicate key update field1=value1,field2=value2,field3=value3,......;

注意点:

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

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


(2019.6.20更新)这段时间,同事写接口代码用到了这个,但是遇到了问题:并发量大的时候,接口请求速度大于2s的次数会经常出现(请求频率大概一天有上百万次,高的时候可到千万吧)找了很久,问了几个前辈都没找到问题。最后改为原子操作(SELECT+INSERT or UPDATE 的方案),出现慢请求的次数就少了。。。具体原因他也没找到。

先说下优缺点吧:

优点:

  1. 开发简单,对已有表批量插入新数据时尤其方便(特别是做表数据同步脚本,真香!)
  2. 可以减少网络连接开销(减少了数据查询、操作次数),在一定量的数据操作时,效率上也提高。

缺点:

  1. MySQL私有语法,非SQL92标准语法,当迁移数据时会造成麻烦,需要改写代码。例如MySQL迁移PgSQL。
  2. 当环境复杂时,数据量大的情况下,会出现意想不到的问题。(数据量大、产生并发,建议还是用原子操作)
  3. 业务逻辑分散在应用逻辑层和数据层,会对项目维护留下隐患。

找了下原因,可能是下面的问题导致的(个人觉的应该是第二种情况),不过由于不是本人负责的,也就没有花太多时间去认真探究这个问题的根源。

1.数据库备份使用的xtrabackup,其备份之后会打成tar包,然后删除源文件;由于备份文件比较大,所以在删除的瞬间导致磁盘IO压力过大!因而导致此问题的产生。

参见:http://www.itpub.net/thread-1941532-1-1.html

2.insert ... on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。如果有两个事务并发的执行同样的语句,那么就会产生死锁。

参见:https://blog.csdn.net/pml18710973036/article/details/78452688  或 https://www.colabug.com/3166910.html

建议:

1、不对存在多个唯一键的数据表使用此语句。

2、在有可能有并发事务执行的insert 语句情况下不使用该语句。

3、使用此语句要考虑以后是否会做数据迁移,数据量是否大,考虑后再使用!!!

on duplicate key update 的用法及优缺点相关推荐

  1. on duplicate key update用法及优缺点

    Mysql on duplicate key update用法及优缺点 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分 ...

  2. Mysql on duplicate key update用法及优缺点

    在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPL ...

  3. ON DUPLICATE KEY UPDATE 用法与说明

    ON DUPLICATE KEY UPDATE作用 先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑 语句的作用,当insert的时候如果对应的记录已经存在,则 ...

  4. ON DUPLICATE KEY UPDATE 用法

    注意:ON DUPLICATE KEY UPDATE 是Mysql特有的语法,仅Mysql有效. 作用:当执行insert操作时,有已经存在的记录,执行update操作. 用法: 有一个test表,i ...

  5. mysql insert into on_MySQL之INSERT INTO ON DUPLICATE KEY UPDATE用法详解 | 夕辞

    MySQL数据库使用中如果主键或唯一键冲突,会报错,因此我们会用到insert into on duplicate key update语法,但是该语法具体怎么用以及返回什么值,今天就来讨论下. 首先 ...

  6. INSERT INTO… ON DUPLICATE KEY UPDATE用法

    使用INSERT的时候 有表T(id,A,B,C,D) 插入的时候希望通过A,B索引唯一记录 ,有重复的时候更新C,D INSERT INTO T(A,B,C,D) VALUES (a,b,c,d) ...

  7. SQL语句中ON DUPLICATE KEY UPDATE column=IF(条件,值1,值2 ) 的使用

    Insert...on duplicate key相信大家都知道了,是一个非常好用的功能,可以在批量导入数据的时候插入并且保证在key冲突的时候执行更新操作而不是报错.笔者最近写代码的时候却碰到一个需 ...

  8. 【MySQL】ON DUPLICATE KEY UPDATE 解决重复插入问题

    参考文章:mysql "ON DUPLICATE KEY UPDATE" 语法 ON DUPLICATE KEY UPDATE 开发过程中,可能会遇到这样的需求,先判断某一记录是否 ...

  9. ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改

    ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改 本文学习自ON DUPLICATE KEY UPDATE 用法与说明 首先声明:ON DUPLICATE KEY UPDA ...

最新文章

  1. Q686 重复叠加字符串匹配
  2. 摩拜活跃用户跌200万、使用次数跌6400万或告别榜首之争?
  3. stoi() 函数----将一个string类型转换为int型
  4. java程序发送邮件_用java程序发送邮件
  5. DIY一只机器狗需要多少钱?最低仅900美元,斯坦福大学出品,代码已开源
  6. c语言 更新学生信息,求学生信息管理系统C语言版
  7. 一个未完成创业项目的思考——创业杂记
  8. 《爱的五种能力》读书笔记
  9. “钩子”、体验和思考人生,一家瑞典游戏工作室如何站稳脚跟,又不被自己的野心呛到
  10. 安卓10.1寸大屏车载导航
  11. python绘制一个时间的七段数码管实例基本的七段数码管绘制
  12. 微信怎样将图片上的文字变成文档
  13. MATLAB矩阵生成
  14. ffmpeg 音乐循环_自媒体良器:音频文件批处理,FFmpeg一行搞定!果断收藏
  15. linux(ubuntu)查看硬件设备命令
  16. 成年男性如何挑选衣服
  17. iOS 设置字体 自定义字体
  18. python实现电影文件名批量更新
  19. 新浪微薄与腾讯微薄的第三方登录
  20. 微信小程序私教预约管理系统+后台管理系统

热门文章

  1. SQL如何求解多元一次方程和构造连续整数
  2. 互信息介绍及MATLAB代码实现
  3. 计算机启动时显示更改了硬件或软件吗,window未能启动,原因可能是最近更改了硬件或软件,解决此问题的步骤。...
  4. 那杯社会责任的咖啡千滋百味
  5. 不眠的硅谷——Just For Fun
  6. 风林火山游戏运营综合测试题2
  7. Aquqnee海洋元宇宙,沉浸式海洋探险即将开启
  8. 计算机启动盘安装教程,u启动u盘启动盘制作工具制作u盘启动盘及u盘装系统教程...
  9. Joy:监控加密的网络流量
  10. linux查询 home所剩空间,df空间占用已满,但du查看home目录空间占用却很少