有这个简单的表格:
id - key auto_increment int,
mail - primary_key - varchar ,
type - primary_key - int,
具有以下查询:将ignore插入表(id,mail,type)......
添加具有相同邮件和类型的记录时,不会添加此记录,这是可以的。 但同时即使没有添加记录,id字段也会自动增加。 有什么方法可以阻止这种情况吗?
答案 0 :(得分:4)
如果插入失败,您可以设置配置变量innodb_autoinc_lock_mode=0
以更改InnoDB丢弃ID的方式。
请参阅http://dev.mysql.com/doc/refman/5.6/en/innodb-auto-increment-configurable.html
innodb_autoinc_lock_mode = 0(“传统”锁定模式)
此锁定模式提供与innodb_autoinc_lock_mode存在之前相同的行为。对于所有“INSERT-like”语句,获取特殊的表级AUTO-INC锁并保持到语句的末尾。 这可确保任何给定语句指定的自动增量值是连续的。
(强调我的)
请注意,此锁定模式还具有保持表锁定的效果,直到INSERT完成(成功失败),并且如果有许多并发线程将行插入同一个表,则会阻碍吞吐量。
如果您的并发插入率较低,则不一定会对您的应用程序产生任何实际影响。
因此,为了回答您的原始问题,即使插入在默认的InnoDB行为中失败,auto-inc值也会增加,因为这样可以让MySQL更快地释放表锁,即在它增加了auto-inc之后,但在尝试插入之前。但这意味着如果插入失败,其他一些线程可能已经分配了 next auto-inc值,因此您的线程无法取消分配其ID。