如果 INSERT 失败,MySQL 5.1 及更高版本中的默认auto_increment行为将“丢失”自动递增值。也就是说,它每次递增 1,但如果 INSERT 失败,则不会撤消递增。丢失~750个值并不常见,但并非不可能(我咨询了一个网站,该网站为每个成功的INSERT跳过1500)。
您可以更改为使用MySQL 5.0行为,并避免在某些情况下丢失值。有关更多详细信息,请参阅 http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html。innodb_autoinc_lock_mode=0
要检查的另一件事是配置变量的值。默认情况下为 1,但您可能已更改此项。同样,将其设置为高于1或2的非常不常见,但可能是可能的。auto_increment_increment
我同意其他评论者的观点,autoinc列旨在是唯一的,但不一定是连续的。你可能不应该担心它,除非你把autoinc值提高得如此之快,以至于你可能会用完INT的范围(这发生在我身上)。
你究竟是如何修复它跳过1500的?
INSERT 失败的原因是存在另一个具有 UNIQUE 约束的列,并且 INSERT 尝试在该列中插入重复的值。阅读我链接到的手册页面,详细了解为什么这很重要。
修复方法是先执行 SELECT 以检查该值是否存在,然后再尝试插入它。这违背了常识,即只需尝试 INSERT 并处理任何重复的键异常。但在这种情况下,失败的 INSERT 的副作用导致自动 inc 值丢失。首先执行 SELECT 会消除几乎所有此类异常。
但是,您还必须处理可能的异常,即使您首先选择也是如此。您仍然有争用条件。
你是对的!innodb_autoinc_lock_mode=0 就像一个魅力。
在你的情况下,我想知道为什么这么多插入失败。我怀疑像许多SQL开发人员一样,您在AJAX处理程序中执行INSERT后不会检查成功状态,因此您永远不会知道其中有这么多失败。
他们可能仍然失败,你只是没有失去自动inc id作为副作用。你应该真正诊断为什么会发生这么多失败。您可能正在生成不完整的数据,或者运行比必要多得多的事务。
在 38 中更改 782 后,可以使用 重置自动增量。这样,您就可以在39岁时继续。ALTER TABLE mytable AUTO_INCREMENT = 39
但是,您应该检查为什么间隙如此之高,并相应地更改设计。更改自动状态不应是“默认”行为。
-
相当于Java中PHP的crypt函数 我正在将我的PHP代码迁移到Google App Engine - Java。因此,我需要一个相当于Java中PHP的crypt函数,因为我已将使用crypt的注册用户的所有密码存储在我的数据库中。 编辑1:这是我用于加密密码的php
-
需要有关如何从接受语言请求标头获取首选语言的示例 我需要一个代码示例或库来解析标头并返回我的首选语言。 指出: “接受语言请求标头”字段类似于“接受”,但限制首选作为请求响应的自然语言集。语言标记在第 3.10 节中定义。
-
无法在 Java 和 PHP 之间交换使用 AES-256 加密的数据 我的问题是:我在Java中加密的东西,我可以在Java中完全解密,但PHP不能解密。我用加密的内容可以使用 解密,但不能在 Java 中解密。 我想从Java应用程序发送和接收加密数据到PHP页面,所以我
-
-
Quercus是Java环境中PHP的可行替代品吗? 对于任何偶然发现这个问题的人,他们不知道是什么 - 它是用Java完成的PHP的实现。 对于我目前正在从事的项目,我们通过cgi在servlet上提供php页面(我知道它很笨拙,但这是支持遗留代码的要求