自动递增跳过数字?

2022-08-30 21:05:38

注意:我是数据库和 PHP 的新手

我有一列设置为 和 。orderauto incrementunique

在我的PHP脚本中,我使用AJAX来获取新数据,但问题是跳过数字并且要高得多,因此迫使我在插入数据时手动更新数字。在这种情况下,我最终会更改为.order78238

$SQL = "INSERT IGNORE INTO `read`(`title`,`url`) VALUES\n ".implode( "\n,",array_reverse( $sql_values ) );

如何让它递增 +1?


答案 1

如果 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.htmlinnodb_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作为副作用。你应该真正诊断为什么会发生这么多失败。您可能正在生成不完整的数据,或者运行比必要多得多的事务。


答案 2

在 38 中更改 782 后,可以使用 重置自动增量。这样,您就可以在39岁时继续。ALTER TABLE mytable AUTO_INCREMENT = 39

但是,您应该检查为什么间隙如此之高,并相应地更改设计。更改自动状态不应是“默认”行为。


推荐