注意:我是数据库和PHP的新手
我的order
列设置为auto increment
和unique
。
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?
答案 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)