gpt4 book ai didi

php - 自动递增跳过数字?

转载 作者:行者123 更新时间:2023-11-29 19:39:56 32 4
gpt4 key购买 nike

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

我有一个order列,设置为自动增量唯一

在我的 PHP 脚本中,我使用 AJAX 来获取新数据,但问题是,order 会跳过数字并且明显更高,因此迫使我在以下情况下手动更新数字:数据被插入。在这种情况下,我最终会将 782 更改为 38

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

如何让它增加+1?

最佳答案

如果 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了解更多详情。

另一件事要检查的是 auto_increment_increment 配置变量的值。默认情况下为 1,但您可能已更改此值。同样,将其设置为高于 1 或 2 的情况很少见,但也是可能的。

我同意其他评论者的观点,autoinc 列旨在是唯一的,但不一定是连续的。您可能不应该太担心它,除非您将 autoinc 值提高得如此之快以至于您可能会超出 INT 的范围(这已经发生在我身上)。

<小时/>

How exactly did you fix it skipping 1500 for ever insert?

INSERT 失败的原因是另一列带有 UNIQUE 约束,并且 INSERT 试图在该列中插入重复值。请阅读我链接到的手册页,详细了解为什么这很重要。

修复方法是在尝试 INSERT 之前先执行 SELECT 来检查该值是否存在。这违背了常识,即仅尝试插入并处理任何重复的键异常。但在这种情况下,失败的 INSERT 的副作用导致 auto-inc 值丢失。首先执行 SELECT 消除了几乎所有此类异常。

但是您必须处理可能的异常,即使您先选择。您仍然存在竞争条件。

You're right! innodb_autoinc_lock_mode=0 worked like a charm.

就您而言,我想知道为什么这么多插入失败。我怀疑,像许多 SQL 开发人员一样,在 AJAX 处理程序中执行 INSERT 后,您不会检查成功状态,因此您永远不知道其中有很多都失败了。

他们可能仍然失败,你只是没有失去自动添加 ID 作为副作用。您应该真正诊断为什么会发生如此多的失败。您可能会生成不完整的数据,或者运行超出必要数量的事务。

关于php - 自动递增跳过数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414336/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com