为什么mysql插入忽略增加自动增量字段?

时间:2013-09-23 15:53:46

标签: mysql

有这个简单的表格:

id - key auto_increment int, 
mail - primary_key - varchar ,
type - primary_key - int,

具有以下查询:将ignore插入表(id,mail,type)......

添加具有相同邮件和类型的记录时,不会添加此记录,这是可以的。 但同时即使没有添加记录,id字段也会自动增加。 有什么方法可以阻止这种情况吗?

1 个答案:

答案 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。