MySQL主键重命名

标签 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张表数据量巨大。

现在我尝试将 TABLE1 中的 ID 重命名为 OLD_ID

我想通过设置 SET FOREIGN_KEY_CHECKS = 0; 重命名 ID 列 但无法重命名并出现以下错误

Error Code: 1846 ALGORITHM=COPY is not supported. Reason: Columns participating in a foreign key are renamed. Try ALGORITHM=INPLACE.

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

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

我正在 MySql 中进行此事件。

最佳答案

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

据此 - 当foreign_key_checks=0时,InnoDB允许一个索引所需的索引 要删除的外键约束,将表放入 不一致并导致表加载时发生外键检查 失败。 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`)

关于MySQL主键重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46494091/

相关文章:

mysql - 如何在 Google Cloud Sql 副本上创建 View ?

MySQL 15 分钟内的第一行

php - 如何将零索引逗号分隔值分解为PHP中的单个字符串

MYSQLQuery-如何创建一个查询,我们必须列出购买同一歌手特定数量专辑的客户

php - mysql php crud问题

php - 从 mysql 数据库字符串字段中提取所有文件链接 url 到列表

mysql - 如何在不同服务器上运行的不同数据库(MYSQL)中的两个表之间同步数据

php - 带有 session 或数据库的多页申请表?

php - 如何将android中相机拍摄的图像上传到MYSQL数据库

QueryBuilder 的 Mysql JOIN 错误