0

我们正在将现有产品表导入到我们自己的新表中。我们编写的导入脚本运行良好并插入了适量的行(6000 左右)。但是,在导入之后,下一个自动递增的主键/id 比表中的行数高出 1500 个(左右)。

我们无法理解 MySQL 为什么要这样做,我们希望它停止。我已经在网上进行了通常的搜索以寻求帮助,但我正在画一个空白 - 有什么想法吗?

4

2 回答 2

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”列,或者为id创建没有 AUTO_INCREMENT的表,导入数据并运行这个简单的 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 列更改为自动递增并为下一个自动索引设置适当的值。

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

于 2010-09-06T15:06:12.590 回答
0

如果执行此命令:

show create table Foo

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

然后,您应该创建新表,将 AUTO_INCREMENT 设置为 0(或 1,我记不得了)。这应该可以解决问题。

于 2010-09-06T11:24:06.113 回答