【发布时间】:2016-04-03 21:57:26
【问题描述】:
我在 Ubuntu 中有一个 MySQL 5.5 (5.5.45-1+deb.sury.org~trusty+1-log),在执行迁移查询时遇到了奇怪的行为。
查询是这样的:
insert into db1.table1 (col2)
select col2
from db2.table1 as a
inner join db1.table2 as d on a.id = d.uuid
inner join db1.table3 as c on a.id = c.uuid
where c.id = 2;
查询后我得到如下数据:
1 xxx
2 xxx
3 xxx
之后我像这样执行单个插入:
insert into db1.table1 (col2) values('xxx');
insert into db1.table1 (col2) values('xxx');
insert into db1.table1 (col2) values('xxx');
我在自动增量中得到一个跳跃:
1 xxx
2 xxx
3 xxx
34 xxx
35 xxx
36 xxx
在执行第一个查询后,该跳转始终是确定性的。
有人知道为什么会这样吗?
如何确保在数据迁移后下一个注册表获得正确的 ID?
谢谢!
我发现这是 mysql 5 的一个已知问题。Mysql auto increment jumps when insert-select
所以我认为这是一个错误。
【问题讨论】:
-
通常这意味着 auto_increment 已被调用并且记录已被删除或从未提交。至于数据的迁移:开启auto_increment列,直到数据导入完成后再开启auto_increment列。
-
我已经复制了您的 dbs 和表最小架构并尝试了相同的选择和插入,并且一切都按预期运行,我没有得到自动增量的跳跃。
-
您是否希望 table1 与 db2 具有相同的值?或者从1重新开始。如果值相同,您可以将相关列添加到您的插入中,我记得MySql不需要关闭自动增量来插入值。
-
我不需要关闭自动增量,因为我在 db2 中没有自动增量列,我期望数据库在该列中生成数字(并且工作得很好)。问题是在执行迁移之后,我希望如果大容量插入插入 10 行,自动增量索引将保持在 11。但由于某种原因,在大容量插入后它以 32 结束。
标签: mysql auto-increment identity