自动增量跳过数字?

时间:2013-07-22 22:56:30

标签: php mysql database phpmyadmin

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

我的order列设置为auto incrementunique

http://f.cl.ly/items/3u2D1l1j2l0j0A16450I/Image%202013-07-22%20at%207.00.15%20PM.png

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

http://f.cl.ly/items/0N2J1w1Y310E2H2o0m05/Image%202013-07-22%20at%206.49.20%20PM.png

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

如何让它增加+1?

4 个答案:

答案 0 :(得分:17)

如果INSERT失败,MySQL 5.1及更高版本中的默认auto_increment行为将“丢失”自动递增值。也就是说,它每次递增1,但如果INSERT失败则不撤消增量。丢失约750个值但不是不可能的情况并不常见(我为每个成功插入INSERT的网站提供了咨询。)

您可以更改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的范围(这已经发生在我身上)。


  

你究竟是如何修复跳过1500而不是插入?

INSERT失败的原因是有另一个列上有UNIQUE约束,INSERT试图在该列中插入重复值。阅读我链接的手册页,了解其重要性的详细信息。

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

但是你必须处理一个可能的异常,即使你先选择SELECT。你还有竞争条件。

  

你是对的! innodb_autoinc_lock_mode = 0就像一个魅力。

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

他们可能仍然失败,你只是不会因为副作用而失去auto-inc id。你应该真的诊断为什么这么多失败发生。您可能要么生成不完整的数据,要么运行超过必要的更多事务。

答案 1 :(得分:1)

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

但是,您应该检查为什么差距太大并相应地更改您的设计。更改自动化不应该是"默认"行为。

答案 2 :(得分:0)

自动增量无关紧,如果删除某些行 - 每次插入一行时,该值都会递增。

如果您想要一个没有间隙的编号,请不要使用自动增量并自行完成。你可以使用这样的东西来插入

INSERT INTO tablename SET
    `order` = (SELECT max(`order`) + 1 FROM (SELECT * from tablename) t),
    ...

如果删除一行,则必须手动重新排列订单栏

答案 3 :(得分:0)

我知道问题已经得到了解答..但是如果你之前删除了表中的行,mysql会记住使用的ID / Number,因为通常你的自动增量是唯一的。因此不会创建重复的增量..要从当前最大ID /整数重新索引和增量,您可以执行:

ALTER TABLE TableName AUTO_INCREMENT=(SELECT max(order) + 1 FROM tablename)