replace into 主键冲突,并且事务不退出。

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 是怎么样的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值