我们正在将现有产品表导入到我们自己的新表中。我们编写的导入脚本运行完美,并插入适当数量的行(6000左右)。但是,导入后,下一个自动递增的主键/ id是表中行数以上的1500个条目(或左右)。
我们无法理解为什么MySQL会这样做,我们希望它能够停止。我已经完成了在线寻找帮助的常规搜索,但我正在画一个空白 - 任何想法?
答案 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,我不记得从我的头顶)。这应该可以解决问题。