mysql唯一索引冲突的解决方案

本文介绍了在SQL中如何使用INSERT IGNORE、REPLACE及ON DUPLICATE KEY UPDATE等语句处理重复记录的方法,包括它们的工作原理及使用场景,帮助读者理解并正确应用这些SQL特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:

 

  • insert ignore into

insert ignore into  (使用唯一索引再次插入相同的值会忽略提示*如果insert into 数据库会报错*,相同值不会插入但id指针会向后跳一位),这样当有重复记录就会忽略,执行后返回数字0。

例子:

insert ignore into table_name(a,b,c) values(1,2,3);
  • REPLACE

REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:

尝试把新行插入到表中 
当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时: 
从表中删除含有重复关键字值的冲突行 
再次尝试把新行插入到表中 
旧记录与新记录有相同的值的判断标准就是:
表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

返回值:
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和
受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。

模型:

REPLACE INTO `table_name`(`col_name`, ...) VALUES (...);
REPLACE INTO `table_name` (`col_name`, ...) SELECT ...;
REPLACE INTO `table_name` SET `col_name`='value',
  • ON DUPLICATE KEY UPDATE

对重复唯一索引的行数据,只更新修改ON DUPLICATE KEY UPDATE后面的参数值。

INSERT INTO `table_name` (`a`, `b`, `c`) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE `b`=VALUES (`b`),`c`=VALUES (`c); 

如果列b也是唯一列,则INSERT与此UPDATE语句相当:

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;  

如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。

示例:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); 

本语句与以下两个语句作用相同:

INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=3;  
INSERT INTO table (a,b,c) VALUES (4,5,6)  ON DUPLICATE KEY UPDATE c=9; 

当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值