当前位置: 首页 > 科技观察

mysql插入记录时唯一键冲突怎么处理

时间:2023-03-20 01:06:00 科技观察

mysql插入记录结果提示主键冲突,怎么办?批量插入数据时,发现批量插入的数据中有部分记录存在唯一键冲突。在这种情况下,尤其是多线程插入数据的时候,会因为catch异常导致异常终止处理或者忽略部分数据。有什么好的方法可以处理这些相互冲突的记录吗?下面提供了三种处理方式1.忽略关键字在某些场景下,我们需要批量插入数据,其中一些数据已经在DB中了。我们希望有冲突的时候直接跳过,能插入的都插入,在这种情况下,使用ignore关键字更为合适。实际案例如下:INSERTIGNOREINTOtest.licenses(license_id,organization_id,license_type,product_name,license_max,license_allocated,comment)VALUES('08dbe05-606e-4dad-9d33-90ef10e334f9','442adb6e-fa58-47f3-9ca2-ed1fecdfe86c','core-prod','WildCatApplicationGateway',16,16,NULL),('38777179-7094-4200-9d61-edb101c6ea88','442adb6e-fa58-47f3-9ca2-ed1fecdfe86c','user','春天',100,6,NULL);执行截图如下,注意统计框中的内容,表示忽略了一个,插入成功了一个。如果有冲突的数据被丢弃,此时可以使用replaceinto。语法如下:REPLACEINTOtest.licenses(license_id,organization_id,license_type,product_name,license_max,license_allocated,comment)VALUES('38777179-7094-4200-9d61-edb101c6ea88','442adb6e-fa58-47f3-9ca2-ed1fecdfe8'核心产品','Spring核心',100,8,NULL);执行截图如下,注意红框中,当一条记录发生冲突被替换时,受影响的行数为2,实际过程是删除冲突数据,插入新数据3.ONDUPLICATEKEYUPDATE有另一种情况是当发生冲突时我们只想更新一些数据。这时候我们可以在insert语句的末尾添加onduplicatekeyupdate。语法如下INSERTINTOtest.licenses(license_id,organization_id,license_type,product_name,license_max,license_allocated,comment)VALUES('38777179-7094-4200-9d61-edb101c6ea88','442adb6e-fa58-47f3-9ca2-ed1fecdfe86c','user','Spring',100,6,NULL)重复密钥更新license_allocated=12;执行截图如下,这是在原来记录的基础上更新指定key的值,比如上面的插入,当有冲突时,我们只更新license_allocated字段,其他字段没有更新