我写了一个访问MySQL innodb数据库的java程序.
每当INSERT IGNORE语句遇到重复条目时,Auto Increment主键就会递增.
这种行为是预期的吗?我认为IGNORE不应该发生这种情况.这意味着IGNORE实际上会产生额外的开销来写入新的主键值.
表格如下:
CREATE TABLE `tablename` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`rowname` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `rowname` (`rowname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
谢谢!
Eug*_*ash 35
这是自MySQL 5.1.22以来的默认行为.
您可以将配置变量设置innodb_autoinc_lock_mode为0(也称为"传统"锁定模式)如果您想避免自动增量列中的间隙.但是,它可能会导致性能下降,因为此模式具有在INSERT完成之前保持表锁定的效果.
从InnoDB上的文档AUTO_INCREMENT锁定模式:
innodb_autoinc_lock_mode = 0("传统"锁定模式)传统的锁定模式提供了与
innodb_autoinc_lock_modeMySQL 5.1中引入配置参数之前相同的行为.传统的锁定模式选项用于向后兼容,性能测试以及解决"混合模式插入"问题,因为语义可能存在差异.在此锁定模式下,所有"INSERT-like"语句都会获得一个特殊的表级
AUTO-INC锁,以便插入带有AUTO_INCREMENT列的表中.此锁通常保持在语句的末尾(而不是事务的结尾),以确保为给定的INSERT语句序列以可预测和可重复的顺序分配自动增量值,并确保自动增量值由任何给定的声明分配是连续的.
Joe*_*lli 12
我相信这是InnoDB中的可配置设置.请参阅:InnoDB中的AUTO_INCREMENT处理
你想要去
innodb_autoinc_lock_mode = 0
Run Code Online (Sandbox Code Playgroud)