为什么INSERT IGNORE会增加auto_increment主键?

Vas*_*lis 23 mysql

我写了一个访问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_mode0(也称为"传统"锁定模式)如果您想避免自动增量列中的间隙.但是,它可能会导致性能下降,因为此模式具有在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)