springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法

向MySQL插入数据有时会遇到主键重复的场景,原来的做法是先在程序代码中SELECT一下,判断是否存在指定主键或唯一键的数据,如果没有则插入,有的话则执行UPDATE操作,或另外一套逻辑,这种方法是不方便的。下面就介绍三种如何避免插入重复值的处理方法。

IGNORE

IGNORE的作用是插入的值遇到主键(PRIMERY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的数据,不影响后面数据的插入,即有则忽略,无则插入。,语法为:

INSERT IGNORE INTO ignore_tbl VALUES(1078,'MIKE');

简要介绍一下主键和唯一键的区别:

1、当一个属性声明为主键时,它将不接受NULL值。另一方面,当声明为Unique的属性时,它可以接受一个NULL值。

2、表中只能有一个主键,但可以有多个唯一键。

3、定义主键时自动创建聚簇索引。相反,Unique键生成非聚集索引。

e36dcfde8b78ea6894b765f7e1ee548d.png

正常情况下,插入主键(ID)相同的数据,会报错:

03cbcddf6dfa83c64ce31ef2a4696a67.png

加入IGNORE后:

f8c18fe8b7063877cee3114c72abc36c.png

插入数据不重复时,则可以正常插入:

a35da2971cf4a7420672257313fb9d76.png

REPLACE

该关键字的作用是当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入,即有则删除+插入,无则插入,语法为:

REPLACE INTO replace_tbl() VALUES(); 
c86a33bab0045e71505342a0f1824d09.png

现在使用REPLACE操作:

76f033d0d19efd77e9d20ce7f892dfc8.png

ON DUPLICATE KEY UPDATE

ON DUPLICATE KEY UPDATE 作用是当插入的记录遇到主键或者唯一键重复时,会执行后面定义的UPDATE操作。

相当于先执行Insert 操作,再根据主键或者唯一键执行update操作,即**有则更新,无则插入。**语法为:

INSERT INTO Tupdate() VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE NAME1=NAME1+1;

edfd68b9b2077185557df46f71036a57.png

使用ON DUPLICATE KEY UPDATE操作:

ff1953975fc321a667d3faba623a0bd8.png

上面的操作相当于:

379be675abdd2888aede247dc7eddbbe.png

如果插入不重复的数据则不去做更新操作:

7acd8ac7ad1174ee4d620d768636e915.png

再举一个例子:

580ae7a30b0955190d7f6749127d81af.png

在ON DUPLICATE KEY UPDATE后面使用VALUES指的就是已插入的记录的值,而不使用VALUES指的是表的自身值。

注意: ON DUPLICATE KEY UPDATE的后面执行的UPDATE更新的记录是WHERE重复的主键或者唯一键的ID,这点非常重要。

比如上张表而言:

d5bfde7f027c4d551bead3471415b9c8.png

也就是说,第二条记录(2,1)的1作为唯一键与第一条数据(1,1)的唯一键1重复了,因为(1,1)是先插入的,那么对它做更新操作(WHERE ID=1),取VALUES(ID)也就是2作+1操作NAME1=VALUES(ID)+1。总而言之,就是对已有数据进行更新操作,而不是新增数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值