on duplicate key update 的用法及优缺点
项目中数据的操作有时候会令人头大,遇到一个需求:
需要将数据从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 的方案),出现慢请求的次数就少了。。。具体原因他也没找到。
先说下优缺点吧:
优点:
- 开发简单,对已有表批量插入新数据时尤其方便(特别是做表数据同步脚本,真香!)
- 可以减少网络连接开销(减少了数据查询、操作次数),在一定量的数据操作时,效率上也提高。
缺点:
- MySQL私有语法,非SQL92标准语法,当迁移数据时会造成麻烦,需要改写代码。例如MySQL迁移PgSQL。
- 当环境复杂时,数据量大的情况下,会出现意想不到的问题。(数据量大、产生并发,建议还是用原子操作)
- 业务逻辑分散在应用逻辑层和数据层,会对项目维护留下隐患。
找了下原因,可能是下面的问题导致的(个人觉的应该是第二种情况),不过由于不是本人负责的,也就没有花太多时间去认真探究这个问题的根源。
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 的用法及优缺点相关推荐
- on duplicate key update用法及优缺点
Mysql on duplicate key update用法及优缺点 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分 ...
- Mysql on duplicate key update用法及优缺点
在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPL ...
- ON DUPLICATE KEY UPDATE 用法与说明
ON DUPLICATE KEY UPDATE作用 先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑 语句的作用,当insert的时候如果对应的记录已经存在,则 ...
- ON DUPLICATE KEY UPDATE 用法
注意:ON DUPLICATE KEY UPDATE 是Mysql特有的语法,仅Mysql有效. 作用:当执行insert操作时,有已经存在的记录,执行update操作. 用法: 有一个test表,i ...
- mysql insert into on_MySQL之INSERT INTO ON DUPLICATE KEY UPDATE用法详解 | 夕辞
MySQL数据库使用中如果主键或唯一键冲突,会报错,因此我们会用到insert into on duplicate key update语法,但是该语法具体怎么用以及返回什么值,今天就来讨论下. 首先 ...
- 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) ...
- SQL语句中ON DUPLICATE KEY UPDATE column=IF(条件,值1,值2 ) 的使用
Insert...on duplicate key相信大家都知道了,是一个非常好用的功能,可以在批量导入数据的时候插入并且保证在key冲突的时候执行更新操作而不是报错.笔者最近写代码的时候却碰到一个需 ...
- 【MySQL】ON DUPLICATE KEY UPDATE 解决重复插入问题
参考文章:mysql "ON DUPLICATE KEY UPDATE" 语法 ON DUPLICATE KEY UPDATE 开发过程中,可能会遇到这样的需求,先判断某一记录是否 ...
- ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改
ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改 本文学习自ON DUPLICATE KEY UPDATE 用法与说明 首先声明:ON DUPLICATE KEY UPDA ...
最新文章
- Q686 重复叠加字符串匹配
- 摩拜活跃用户跌200万、使用次数跌6400万或告别榜首之争?
- stoi() 函数----将一个string类型转换为int型
- java程序发送邮件_用java程序发送邮件
- DIY一只机器狗需要多少钱?最低仅900美元,斯坦福大学出品,代码已开源
- c语言 更新学生信息,求学生信息管理系统C语言版
- 一个未完成创业项目的思考——创业杂记
- 《爱的五种能力》读书笔记
- “钩子”、体验和思考人生,一家瑞典游戏工作室如何站稳脚跟,又不被自己的野心呛到
- 安卓10.1寸大屏车载导航
- python绘制一个时间的七段数码管实例基本的七段数码管绘制
- 微信怎样将图片上的文字变成文档
- MATLAB矩阵生成
- ffmpeg 音乐循环_自媒体良器:音频文件批处理,FFmpeg一行搞定!果断收藏
- linux(ubuntu)查看硬件设备命令
- 成年男性如何挑选衣服
- iOS 设置字体 自定义字体
- python实现电影文件名批量更新
- 新浪微薄与腾讯微薄的第三方登录
- 微信小程序私教预约管理系统+后台管理系统
热门文章
- SQL如何求解多元一次方程和构造连续整数
- 互信息介绍及MATLAB代码实现
- 计算机启动时显示更改了硬件或软件吗,window未能启动,原因可能是最近更改了硬件或软件,解决此问题的步骤。...
- 那杯社会责任的咖啡千滋百味
- 不眠的硅谷——Just For Fun
- 风林火山游戏运营综合测试题2
- Aquqnee海洋元宇宙,沉浸式海洋探险即将开启
- 计算机启动盘安装教程,u启动u盘启动盘制作工具制作u盘启动盘及u盘装系统教程...
- Joy:监控加密的网络流量
- linux查询 home所剩空间,df空间占用已满,但du查看home目录空间占用却很少