为什么MySQL auto_increment会跳过数字

时间:2010-09-06 10:28:42

标签: mysql database import autocomplete mysqlimport

我们正在将现有产品表导入到我们自己的新表中。我们编写的导入脚本运行完美,并插入适当数量的行(6000左右)。但是,导入后,下一个自动递增的主键/ id是表中行数以上的1500个条目(或左右)。

我们无法理解为什么MySQL会这样做,我们希望它能够停止。我已经完成了在线寻找帮助的常规搜索,但我正在画一个空白 - 任何想法?

2 个答案:

答案 0 :(得分:1)

我们以这个简单的表格为例:

CREATE TABLE `products` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(64) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

导入文件如下:

"id","name"
1,"product 1"
2,"product 2"
5,"product 3"
102,"product 4"

然后您将数据导入两列,因此自动递增机制不起作用。 导入所有行后,表格的自动增量值设置为 MAX(id)+1 [在这种情况下为 103 ],以确保下一个自动增量ID是唯一的。如果它等于插入的行数,那么下一个自动增量值将为5并且将与第3行对齐。

如果你想要干净的开始和最后一个id等于行数,你必须从 .csv 文件中删除“id”列,或者创建没有AUTO_INCREMENT的表 < / strong>对于 id ,导入数据并运行这个简单的sql:

SET @i=0;
UPDATE `products` SET id=@i:=@i+1 ORDER BY id;
ALTER TABLE `products`  CHANGE COLUMN `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST;

第一个查询设置辅助变量,它将在更新记录之前递增。 第二个更新记录,使id等于行号。 第三个将更改id列自动增量并为下一个autoindex设置适当的值。

但在更改任何主键之前,请确保它们不会在任何其他表中用作外键!

答案 1 :(得分:0)

如果您执行此命令:

show create table Foo

然后你会看到AUTO_INCREMENT=的设置也是如此。 我的猜测是它没有设置为从0开始。

然后你应该创建你的新表,让AUTO_INCREMENT设置为0(或1,我不记得从我的头顶)。这应该可以解决问题。