如果 INSERT 失败,MySQL 5.1 及更高版本中的默认 auto_increment 行为将“丢失”自动增量值。也就是说,它每次增加 1,但如果 INSERT 失败则不会撤消增量。丢失约 750 个值的情况并不常见,但并非不可能(我咨询过一个站点,该站点每次成功插入都会跳过 1500 个值)。
你可以改变innodb_autoinc_lock_mode=0
使用 MySQL 5.0 行为并避免在某些情况下丢失值。看http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html更多细节。
另一件要检查的事情是auto_increment_increment
配置变量。默认情况下为 1,但您可能已更改此值。同样,将其设置为高于 1 或 2 的情况非常罕见,但也是可能的。
我同意其他评论者的观点,autoinc 列旨在是唯一的,但不一定是连续的。你可能不应该太担心它,除非你将 autoinc 值提高得如此之快以至于你可能会超出 INT 的范围(这发生在我身上)。
你究竟是如何修复它跳过 1500 次插入的?
INSERT 失败的原因是另一列带有 UNIQUE 约束,并且 INSERT 尝试在该列中插入重复值。请阅读我链接到的手册页,详细了解为什么这很重要。
修复方法是先执行 SELECT 以检查该值是否存在,然后再尝试插入它。这违背了常识,即仅尝试插入并处理任何重复的键异常。但在这种情况下,失败的 INSERT 的副作用导致 auto-inc 值丢失。首先执行 SELECT 几乎消除了所有此类异常。
But you also即使您先选择,也必须处理可能的异常。你仍然有竞争条件。
你说得对! innodb_autoinc_lock_mode=0 非常有效。
对于你的情况,我想知道why很多插入都失败了。我怀疑,像许多 SQL 开发人员一样,在 AJAX 处理程序中执行 INSERT 后,您不会检查成功状态,因此您永远不知道其中有很多都失败了。
他们可能仍然失败,你只是没有失去自动公司 ID 作为副作用。您应该真正诊断为什么会发生如此多的失败。您可能生成不完整的数据,或者运行超出必要数量的事务。