2

有这个简单的表:

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

有这样的查询:将忽略插入表(id,mail,type)......

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

4

1 回答 1

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”的语句,都会获得一个特殊的表级 AUTO-INC 锁并将其保存到语句的末尾。这确保了任何给定语句分配的自动增量值是连续的。

(强调我的)

请注意,此锁定模式还具有在 INSERT 完成之前保持表锁定的效果(通过失败成功),如果您有许多并发线程将行插入同一个表,则可能会阻碍吞吐量。

如果您的并发插入率较低,这不一定会对您的应用程序产生任何实际影响。

因此,要回答您最初的问题,即使在默认 InnoDB 行为中插入失败时,auto-inc 值也会增加,因为这允许 MySQL 更迅速地释放表锁,即在它增加 auto-inc 之后,但在它之前已尝试插入。但这意味着如果插入失败,其他一些线程可能已经分配了下一个auto-inc 值,所以你的线程不能取消分配它的 id。

于 2013-09-23T16:03:54.180 回答