【问题标题】:Mysql Query moving in a strange way the autoincrement columnMysql Query以一种奇怪的方式移动自动增量列
【发布时间】: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


【解决方案1】:

第一个问题:auto increment primary leaving gaps in counting

第二个:

  • 如果您希望 db1 的自动增量字段与 db2 匹配,请将其包含在插入中(假设字段名称为 id)。我记得,MySql 允许这样的插入(与 MS SQL 不同,在插入之前需要 set identity_insert on 命令)

    插入 db1.table1 (id, col2) 选择 id,col2 从 db2.table1 作为 内部连接 ​​db1.table2 as d on a.id = d.uuid 内部连接 ​​db1.table3 as c on a.id = c.uuid 其中 c.id = 2;

  • 如果没有,您可以编写自己的增量,例如:

    插入 db1.table1 (id, col2) select (select max(id) FROM db1.table1) + 1, col2 从 db2.table1 作为 内部连接 ​​db1.table2 as d on a.id = d.uuid 内部连接 ​​db1.table3 as c on a.id = c.uuid 其中 c.id = 2;

  • 或者在我发布的链接上查看答案..

【讨论】:

  • 您好,关于另一个关于并发造成的差距的问题。我认为这不是问题所在。我正在运行单个用户,并且每个查询都按顺序执行。关于“如果您希望 db1 的自动增量字段与 db2 匹配”,我并不期待它。 db2 没有自动增量列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2021-03-21
  • 2018-04-03
  • 2014-10-31
  • 2014-11-07
相关资源
最近更新 更多