Mysq存在则不插入或存在更新

转自:https://www.sojson.com/blog/288.html

我们遇到挺多这样的问题,当用户并发提交数据,重复提交数据。导致数据重复,或者  Mysql     SQL  报错。

几种解决办法,对应到几种业务场景。

方案一,先查再插

这个应该是最常见的处理方式,是醉不安全的,因为一旦有并发其实完全防止不了,来看看伪代码。

 
  1. Entity entity = service.findById(10);
  2. if(null == entity){
  3. service.insert(obj);
  4. }else{
  5. service.update(obj);
  6. }

先根据条件查询,存在就更新,不存在添加,但是往往我们是集群、多列的状态下,会再你正在判断null == entity的时候,另外一个线程已经插入完毕了,导致你以为是不存在,重复插入。

方案二,存在即更新,不存在即插入

我们平常的INSERT INTO   SQL  是这么写:

 
  1. INSERT INTO demo_in(a,b,c) VALUES(123, 2, 4);

比如C是主键,插入2次就会抛出异常:

 
  1. [23000][1062] Duplicate entry '4' for key 'PRIMARY'

所以我们用到REPLACE关键字,他的作用如题,存在即更新,不存在即插入,和delete + Insert Into 一样。但是它一个原子操作,是一步完成,所以我们不用担心有其他问题的出现,但是使用REPLACE的时候,一定要保证表有唯一主键。

重要:执行REPLACE 语句后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。

 改造一下上面的语句就是:

 
  1. REPLACE INTO demo_in(a,b,c) VALUES(123, 2, 4);

方案三,存在不插入,不存在再插入

这个其实很简单,因为  Mysql  不能做到插入的时候带where条件,故用了一张临时表来处理。

 
  1. INSERT INTO demo_in(a,b,c) SELECT 123, 2, 4 FROM DUAL WHERE NOT EXISTS(SELECT c FROM demo_in WHERE c = 4);

用临时表DUAL来标记数据,然后插入到demo_in表中。条件是c=4,并且not exists,也就是当c=4条件满足,则不插入。

 

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/288.html

转载时必须以链接形式注明原始出处及本声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值