INSERT ... ON DUPLICATE KEY UPDATE导致数据库主键不连续问题

本文探讨了由于使用INSERT ... ON DUPLICATE KEY UPDATE语句导致MySQL表主键ID不连续的问题。测试实验显示,无论执行INSERT还是UPDATE,自增ID都会增加。此外,介绍了innodb_autoinc_lock_mode配置选项对自动增量锁定的影响,讨论了不同模式下并发性和ID连续性的权衡。

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

业务中发现某个表的主键ID不连续,而且这个业务并没有删除操作,难道被黑了?后来检查了代码,发现使用了INSERT ... ON DUPLICATE KEY UPDATE,发现了问题所在。

原因在于,当使用INSERT ... ON DUPLICATE KEY UPDATE时,无论是执行INSERT操作,还是UPDATE操作,都会导致auto increment自增1

 

测试实验

1)建立表

CREATE TABLE `test` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
   `date_num` int(11) NOT NULL DEFAULT '0' COMMENT '整数形式的日期',
   `number` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '预约号ID',
   PRIMARY KEY (`id`),
   UNIQUE KEY `uniq_date_num` (`date_num`)
 ) ENGINE=InnoDB COMMENT='预约号ID生产表'

2)执行语句和结果

INSERT INTO plan_storehouse_warehouse_booking(date_num) values(20191011)
on duplicate key update `number`=`number`+1

当date_num存在时&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值