MyBatis插入数据之ON DUPLICATE KEY UPDATE避免唯一键冲突

在创建数据库表的时候,我们可能会对表中的除主键id外的其它单个字段建立唯一索引UNIQUE INDEX,或者是多个字段组合起来的唯一联合索引(比如‘id, uid, brandId, …’,其中id是主键索引,uid_brandId建立唯一联合索引,brandId建立唯一索引)。
在这里插入图片描述
当执行insert操作对表中插入数据时,如果跟表中已存在的唯一索引的数据冲突,则该操作会执行失败,怎么避免这种情况发生呢?正确做法应该是如果发生冲突则不做插入操作转而做更新操作,以下列举两种方法:

  1. 先做查询判断,再做操作

因为唯一索引在表中肯定是唯一存在的,在做insert插入时,可以先拿插入参数中的唯一索引字段(如上文提到的‘uid’)去表中查询,如果返回值为空则代表没有冲突,可以进行insert操作,反之则冲突,则走update操作。

if (Objects.isNull(getInfoByUid(param.getUid()))){
		//添加操作
		addC(param);
}
else {
		//如果该uid存在,则更新
		update(param);
}

2.在sql中使用ON DUPLICATE KEY UPDATE

在 insert into 语句后面添加 ON DUPLICATE KEY UPDATE,该条sql就会自动判断插入的数据是否和已存在的唯一索引发生冲突,如果没有冲突则执行insert操作,如果发生冲突则不会执行insert而是执行后面的update操作。

条件操作
唯一索引/主键相同更新原有数据
唯一索引/主键不同插入新数据

实例如下:

<insert id="xxx" >
insert into table(`uid`,`brandId`,`status`,`createTime`,`updateTime`)
        values (#{uid},#{brandId},'0',sysDate(),sysDate())
        ON DUPLICATE KEY UPDATE brandId = VALUES(brandId), createTime = VALUES(createTime), status = 0, updateTime = VALUES(updateTime)
</insert>

两种方法的优先使用场景和优缺点:
方法一会对数据库多做一次查询操作,在时间上会相对于方法二多消耗一点;
方法二如果插入的字段比较多的情况下,整条sql语句会显得非常冗长;
总结:如果插入的字段比较多并且对时间效率要求不是特别高的话,使用方法一,反之则使用方法二。

再说几句:
1:ON DUPLICATE KEY UPDATE需要在INSERT语句中存在主键或者唯一索引的列,并且对应的数据已经在表中才会执行更新操作。而且如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。
2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值