SET AUTOCOMMIT = 0
replace into eip_info(inst_id,inst_name,ip,band_width,region_id,state,bind_inst_id,
bind_inst_type,internet_charge_type,charge_type,create_time,update_time,status) values ('eip-xx','xxx-daily-01','xxx','200',
'cn-shenzhen','InUse','xxxx','Nat','PayByTraffic','PostPaid','2023-11-03 11:18:30','2023-11-14 19:30:17','1')
失败(1062)
CREATE TABLE `eip_info` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
PRIMARY KEY (`id`),
UNIQUE KEY `uni_idx_inst_id` (`inst_id`),
KEY `inx_inst_id` (`inst_id`),
KEY `inx_ip` (`ip`),
KEY `inx_inst_name` (`inst_name`),
KEY `idx_status_updatetime` (`status`,`update_time`)
) ENGINE=InnoDB AUTO_INCREMENT=2601424 DEFAULT CHARSET=utf8 COMMENT='eip信息字典表'
>select max(id) from eip_info ;
+---------+
| max(id) |
+---------+
| 2601455 |
+---------+
1 row in set (0.00 sec)
>replace into eip_info(inst_id,inst_name,ip,band_width,region_id,state,bind_inst_id,
-> bind_inst_type,internet_charge_type,charge_type,create_time,update_time,status) values (xxx);
ERROR 1062 (23000): Duplicate entry '2601424' for key 'PRIMARY'
因为 AUTO_INCREMENT=2601424 比表里面的最大值2601455 小所以replace 插入数据会报 主键冲突
如果开启事物主键冲突,事物不会回滚也不会提交。
数据库版本
mysql Ver 14.14 Distrib 5.7.37-40, for Linux (x86_64) using 6.2
可能原因:待分析,
https://cloud.tencent.com/developer/article/1955574
导致该 bug 的原理:
在做replace into操作时,如果主键存在,replace对应的binlog是update;如果主键不存在,replace对应的是insert。
当表中有unique key且replace into发生了唯一索引冲突时,执行的是update,自增主键也会被更新掉
MySQL 原有的逻辑是设计的,算是特性。80没有这个问题,如果可以大版本升级,建议升级下
把replace into语句,改成insert...duplicate语句
不会更新自增主键,不会由上面的问题。
但还需要结合表结构设计的、sql 是怎么样的