我有一个订单列设置为自动递增和唯一.
http://f.cl.ly/items/3u2D1l1j2l0j0A16450I/Image%202013-07-22%20at%207.00.15%20PM.png
在我的PHP脚本中,我使用AJAX获取新数据,但是问题在于,该命令是跳过数字,并且显着增加,从而迫使我在插入数据时手动更新数字.在这种情况下,我会最终更改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?
您可以更改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并处理任何重复的关键字异常.但是在这种情况下,失败的INSERT的副作用会导致auto-inc值丢失.执行SELECT首先消除了几乎所有这些异常.
但是,您也必须处理可能的异常,即使您先选择SELECT.你还有竞争条件.
You’re right! innodb_autoinc_lock_mode=0 worked like a charm.
在你的情况下,我想知道为什么这么多插入是失败的.我怀疑像许多sql开发人员一样,在AJAX处理程序中执行INSERT之后,您不会检查成功状态,因此您永远都不知道这么多的sql Server失败.
他们可能仍然失败,您只是不会因为副作用而失去汽车公司的身份.你应该真正诊断为什么会发生这么多的失败.您可能会生成不完整的数据,或者需要运行更多的事务.