当批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,这种情况特别是在多线程进行数据插入时,会造成异常导致处理终止或者catch异常忽略部分数据。有什么好的办法对这些冲突的记录进行处理呢?
下面提供三种处理方式
1. Ignore关键词
某些场景下,我们需要批量插入的数据,某些已经在DB中了,我们希望在出现冲突时,直接跳过,把能插入的都插入就好,这种情况下,使用ignore关键词就比较合适了。
一个实际的case如下:
INSERT IGNORE INTO test.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','WildCat Application Gateway',16,16,NULL),
('38777179-7094-4200-9d61-edb101c6ea88','442adb6e-fa58-47f3-9ca2-ed1fecdfe86c','user','Spring',100,6,NULL);
执行截图如下, 注意统计框中的内容,表示忽略了一条,执行插入成功一条
2. Replace Into方式
如果在批量插入中,我们希望用新的数据替换掉冲突的数据,这个时候就可以使用replace into了。
语法如下:
REPLACE INTO test.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','core-prod','Spring Core',100,8,NULL);
执行截图如下,注意红框中,当某条记录冲突之后并替换,其影响行数为2, 其实际过程是
3. ON DUPLICATE KEY UPDATE
还有一种情况,我们希望在出现冲突时,只更新某些数据,这个时候可以在insert语句的最后加上on duplicate key update了
语法如下
INSERT INTO test.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)
on duplicate key update license_allocated = 12;
执行截图如下,这个是在原记录的基础上执行更新指定key的value, 比如上面的插入中,当冲突时,我们只更新license_allocated字段,而其它的字段没有更新
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341