MySQL主键重命名

时间:2017-09-29 17:28:58

标签: mysql

我有以下表格

1. TABLE1 (Primary Key ID)
2. TABLE2 (ID Foreign key reference from TABLE1)
3. TABLE3 (ID Foreign key reference from TABLE1)
4. TABLE4 (ID Foreign key reference from TABLE1)
5. TABLE5 (ID Foreign key reference from TABLE1)

以上所有5个表都有大量数据。

现在我正尝试在ID

中将OLD_ID重命名为TABLE1

我想通过设置SET FOREIGN_KEY_CHECKS = 0;来重命名ID列 但无法重命名并低于错误

  

错误代码:1846 ALGORITHM = COPY不受支持。原因:列   重命名参与外键。尝试ALGORITHM = INPLACE。

我知道如果我从所有子表中删除外键,那么我们可以轻松地重命名。但由于数据庞大,在子表中重新加载和添加外键需要花费大量时间。

请建议重命名主键字段的最佳方法是什么?

我正在MySql中执行此活动。

1 个答案:

答案 0 :(得分:0)

实际上它是MySql中的一个错误 - https://bugs.mysql.com/bug.php?id=82946

根据其中 - 使用foreign_key_checks = 0,InnoDB允许a所需的索引 要删除的外键约束,将表放入 不一致并导致在表加载时发生的外键检查 失败。 InnoDB现在可以防止删除外键所需的索引 约束,即使是foreign_key_checks = 0。外键约束 必须在删除外键索引之前删除。

在mysql参考文档中也提到了 - https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_foreign_key_checks

所以你必须先删掉外键

解决方案是首先删除外键,然后更改列,最后再添加约束。

ALTER TABLE `TABLE1`
DROP FOREIGN KEY `mytable_oldname_fk`,
CHANGE COLUMN oldname newname INT(11) DEFAULT NULL,
ADD CONSTRAINT `mytable_newname_fk` FOREIGN KEY (`newname`) REFERENCES `anothertable` (`id`)