有这个简单的表:
id - key auto_increment int,
mail - primary_key - varchar ,
type - primary_key - int,
有这样的查询:将忽略插入表(id,mail,type)......
添加具有相同邮件和类型的记录时,不添加此记录,这是可以的。但与此同时,即使没有添加记录,id 字段也会自动递增。有什么办法可以防止这种情况发生吗?
有这个简单的表:
id - key auto_increment int,
mail - primary_key - varchar ,
type - primary_key - int,
有这样的查询:将忽略插入表(id,mail,type)......
添加具有相同邮件和类型的记录时,不添加此记录,这是可以的。但与此同时,即使没有添加记录,id 字段也会自动递增。有什么办法可以防止这种情况发生吗?
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。