MySQL--更新自增列的潜在风险

本文通过一个具体的MySQL示例,展示了在自增列上执行更新操作可能导致的主键冲突错误,强调了自增列应避免手动更新的重要性。

##=====================================================================##
测试环境:
MySQL版本:MySQL 5.7.19
复制模式:ROW
##=====================================================================##

执行下面语句:

## 创建测试表
DROP TABLE T_001;
CREATE TABLE `T_001` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `C1` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `UNI_C1` (`C1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

##插入记录
INSERT INTO T_001(C1)VALUES(1);

##更新ID列
UPDATE T_001
SET ID=2,
C1=2
WHERE C1=1;

##插入新记录
INSERT INTO T_001(C1)VALUES(3);

执行报错:

ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'

##=====================================================================##
原因分析:
1、第一次INSERT语句,获得自增值为1。
2、UPDATE操作完成,将表中数据的ID列修改为2,但UPDATE操作不会触发表的自增起始值发生变化。
3、第二次INSERT语句,获得自增值为2,由于表中已存在ID=2的记录,因此插入失败,报主键重复。

##=====================================================================##
总结:

1、对于自增列,其自增值与业务无关,应避免对自增列数据进行更新操作,避免出现异常。

##=====================================================================##

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值