几种利用冲突更新数据的方法(不同数据库)

上一周,我遇到了这样的需求,在一个表中有,A,B,C和业务日期四个字段,在同一个业务日期同一个C只保留最新的值。
如果仅仅是这样也不复杂,在插入之前先删除就好了,但是这个数据是批量导入的,而且一批数据的数据量不小。这样的话我也不能先批量删除一遍再插入那也太蠢了,于是我就搜索到了以下几种解决方法,要说明一下这些方法大都不太安全。

1、REPLACE INTO

如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。否则,直接插入新数据。
注意:这个语句效率尚可,但是很容易引发死锁,一次插入的数据量不要太大,可以分批插入。

2、ON DUPLICATE KEY UPDATE

mysql支持这个语句,但是他并不是mysql 的标准语句。这个原理与也是一样的,通过唯一索引检测到冲突的时候,把插入操作变成更新操作。
更新的时候,语句会把冲突的那一行数据存在values中,通过values(字段名)可以取出引发冲突的数据。

3、on conflict do update

mysql不支持这个语句,经过实验postgre支持这个语句(orcale好像也可以),原理跟上文是一样的,只不过引发冲突的数据存在EXCLUDED中,也可以通过EXCLUDED(字段名取出)。
以上方法都容易引发死锁,使用的时候多加小心。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值