服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL插入时唯一键冲突的几种处理方式

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

2022-12-06 19:53枫林晚粥 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);

执行截图如下, 注意统计框中的内容,表示忽略了一条,执行插入成功一条

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

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, 其实际过程是

  • 删除冲突数据
  • 插入新的数据

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

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字段,而其它的字段没有更新

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

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

原文地址:https://www.toutiao.com/article/7173586898655855140/

延伸 · 阅读

精彩推荐
  • MysqlMySQL约束超详解

    MySQL约束超详解

    这篇文章主要介绍了MySQL约束包括非空约束、唯一约束、主键约束、外键约束,需要的朋友可以具体参考下面文章内容...

    LL.LEBRON5922021-09-28
  • Mysql学习mysql 如何行转列与列传行

    学习mysql 如何行转列与列传行

    这篇文章主要介绍了mysql行转列与列传行的使用方法,帮助大家更好的理解和学习MySQL的使用,语句不难,但有一定的知识参考价值,需要的朋友可以参考一...

    孙中明8592022-09-25
  • Mysqlmysql创建存储过程及函数详解

    mysql创建存储过程及函数详解

    大家好,本篇文章主要讲的是mysql创建存储过程及函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    十有八⑨9662022-01-17
  • MysqlMYSQL必知必会读书笔记第三章之显示数据库

    MYSQL必知必会读书笔记第三章之显示数据库

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。接下来通...

    自然鸟神5482020-06-07
  • MysqlMySQL无法启动、无法停止解决方法(安全设置后容易出现)

    MySQL无法启动、无法停止解决方法(安全设置后容易出现)

    最近在Win2003上的MySQL出现过多次正常运行时无法连接数据库故障,根本原因就是因为安全设置以后容易出现的问题,其实很简单的解决 ...

    MYSQL教程网4412019-12-01
  • MysqlMySQL多表查询详解上

    MySQL多表查询详解上

    这篇文章主要介绍了MySQL多表查询详解上,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小...

    木卯生十木9142021-01-23
  • Mysqlmysql执行时间为负数的原因分析

    mysql执行时间为负数的原因分析

    今天看到有人把phpmyadmin中的执行时间出现负数的情况视为phpmyadmin的bug, 其实这种情况的本质是php中浮点数(float)的精度问题。 ...

    mysql教程网3902019-11-10
  • Mysqlmysql服务启动却连接不上的解决方法

    mysql服务启动却连接不上的解决方法

    这篇文章主要为大家详细介绍了mysql服务启动却连接不上的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    CyanSkye8022020-07-23