MySQL插入时唯一键冲突的几种处理方式

数据库 MySQL
当批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,这种情况特别是在多线程进行数据插入时,会造成异常导致处理终止或者catch异常忽略部分数据。有什么好的办法对这些冲突的记录进行处理呢?

MySQL插入记录时,结果提示主键冲突,怎么办?

当批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,这种情况特别是在多线程进行数据插入时,会造成异常导致处理终止或者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字段,而其它的字段没有更新


责任编辑:武晓燕 来源: 今日头条
相关推荐

2022-04-07 13:56:13

前端一键换肤

2023-07-10 08:00:13

架构Rest返回值

2020-10-28 09:44:22

Pythonn爬虫代码

2017-04-17 10:05:51

Hadoop错误方式

2009-12-31 14:25:19

Silverlight

2023-12-07 07:22:52

MySQLIGNORE

2023-10-08 20:31:18

React

2015-02-09 15:25:52

换肤

2021-03-31 09:11:27

URLErrorHTTPError

2010-01-18 16:58:29

VB.NET Over

2024-04-07 08:50:00

GenAIAI人工智能

2022-03-07 14:39:01

前端框架批处理

2016-10-21 10:51:53

Windows快捷程序

2009-07-21 15:47:35

JDBC批处理

2012-08-13 10:23:33

IBMdW

2009-08-17 17:28:23

C#转义字符

2024-03-05 18:15:28

AsyncAwait前端

2009-06-12 08:57:56

Unix字符串处理

2009-08-19 17:30:38

C#转义字符

2010-11-24 09:56:20

mysql拷贝表
点赞
收藏

51CTO技术栈公众号