【问题标题】:Adding AUTO_INCREMENT to existing column in huge table将 AUTO_INCREMENT 添加到大表中的现有列
【发布时间】:2014-12-05 08:35:49
【问题描述】:

我这里有一个相当大的问题...... 我们有一个 MySQL 数据库,其中包含超过 2600 万行的表。 现在,问题是我的 Java 代码正在生成主键(通过 Hibernate 注释),因为该列没有 auto_increment 标志。 (不知道为什么)

此设置有时会导致问题,例如 PK 列上的约束违规。 我想更改它,以便 MySQL 生成自动递增的 PK。

有没有什么方法可以在不重建这个庞大的表的情况下向列添加 auto_increment?及时,因为我们的服务窗口只有 2 小时。

问候

【问题讨论】:

  • 我建议你在表的小样本上作为临时表试一试。如果它需要任何形式的重建,我会感到惊讶。重新定义后,您必须设置自动增量键的下一个值。

标签: java mysql sql hibernate


【解决方案1】:

是的,这很容易。 首先,你必须找出你的最高指数是多少:

SELECT max(id_column) FROM your_table;

然后将表格更改为自动递增

ALTER TABLE your_table CHANGE COLUMN id_column AUTO_INCREMENT;
ALTER TABLE your_table AUTO_INCREMENT = the_value_from_above + 1;

我不能 100% 确定确切的语法,因此您可能需要检查 here 或使用 MySQL Workbench。 这不会重建表,只是更改元数据。

请记住,您还必须让 hibernate 知道 auto_increment。

【讨论】:

  • 这将导致 MySQL 将整个表复制到一个临时表,然后它会进行修改并将内容复制回来。相信我,它不起作用。由于此表中的数据量很大,因此最多需要 12 小时
  • 哦,我绝对确定它不会那样做!也许这取决于版本或表引擎?如何直接破解表定义。你有一个测试系统,不是吗?
  • 我们正在使用 INNODB,我们尝试运行一个类似的问题,这就是我上面评论的内容:(
  • MODIFY COLUMN 和 CHANGE COLUMN 没有任何区别,抱歉。如果不将整个表转储到临时表中,您似乎无法修改列。修改 table-def 不是 100% 安全的,我们已经决定最好保持原样。遗憾的是,我们不能让这花费这么多时间,所以
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 2019-03-24
  • 2023-04-07
相关资源
最近更新 更多