【问题标题】:Why is MySQL auto_increment skipping numbers为什么 MySQL auto_increment 跳过数字
【发布时间】:2012-07-20 06:24:22
【问题描述】:

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

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

【问题讨论】:

  • 您是否在自动递增列中插入任何数据?
  • 没有。我们要让自动增量器去做它的“事情”。
  • 我在运行insert into tb select * from tb1;insert into tb values() for 1 row 时也遇到了同样的情况。最后一个插入跳过了超过 6000 的 auto_increment 字段。难以置信。

标签: mysql database import autocomplete mysqlimport


【解决方案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 为 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 列更改为自动递增,并为下一个自动索引设置适当的值。

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

【讨论】:

  • +1 是一个很好的答案,但这不是问题所在。我们运行导入并创建我们自己的自动增量主键。导入会带来 6000 条(或多条记录)具有连续 ID 的记录。下一个自动 ID 应该是 6001,但我们得到的是 7500(比如说)。
  • 如果是这样,那么唯一想到的就是检查它们是否真的是连续的 - 您是否在导入数据后尝试过SELECT MAX(id) FROM productsALTER TABLE products ORDER BY id 并查看最后一行是否有预测值?
【解决方案2】:

如果你执行这个命令:

show create table Foo

然后你会看到AUTO_INCREMENT= 也被设置了。
我的猜测是它没有设置为以 0 开头。

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

【讨论】:

  • 感谢您的建议,但 AUTO_INCREMENT 设置为 1 并且在大量导入后立即起作用。
猜你喜欢
  • 2020-03-21
  • 2021-03-14
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 2018-01-20
  • 2020-09-23
  • 2014-09-13
  • 1970-01-01
相关资源
最近更新 更多