我们正在将现有产品表导入到我们自己的新表中。我们编写的导入脚本运行完美,并插入了正确数量的行(6000 左右)。但是,导入后,下一个自动递增的主键/id 比表中的行数高出 1500 个条目(左右)。
我们无法理解 MySQL 为什么要这样做,我们希望它停止。我已经在网上进行了常规搜索以寻求帮助,但我一无所获 - 有什么想法吗?
最佳答案
让我们以这个简单的表格为例:
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_INCRMENT 的表 对于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 列以自动递增,并为下一个自动索引设置适当的值。
但是在更改任何主键之前,请确保它们没有在任何其他表中用作外键!
关于mysql - 为什么 MySQL auto_increment 会跳过数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3650731/