mysql - 为什么 MySQL auto_increment 会跳过数字

标签 mysql database import autocomplete mysqlimport

我们正在将现有产品表导入到我们自己的新表中。我们编写的导入脚本运行完美,并插入了正确数量的行(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/

相关文章:

php - 如何将 PHP mysql_fetch_array() 转换为 NSMutableArray? PHP --> Xcode

具有多个值的 PHP PDO-MySQL 准备好的语句

git - 在 Golang 中导入带冒号的路径

java - 将 AUTO_INCREMENT 添加到大表中的现有列

mysql - 如何在 MYSQL 查询中使用聚合函数连接表?

php - 如何插入 MySQL 数据库并在 PHP PDO 中返回其 id?

python - Django:如何以线程安全的方式执行 get_or_create()?

java - 就性能而言哪个更好?

excel - Magento: "Image does not exist"

mysql - 将mysql用户迁移到另一台服务器