如何在mysql中重命名外键?

39

我们刚刚在一个大表上完成了长时间的迁移,最终在我们的conversation_tags表中得到了以下约束:

CONSTRAINT `conversation_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`)

不幸的是,由于某种错误,我们想要的是:

CONSTRAINT `fk_conversation_tags_tags` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`)

删除并重新添加约束将意味着另外两个漫长的查询。是否有任何方法在单个查询中重命名约束?


1
InnoDB 将以字符串“tbl_name_ibfk_”开头的外键约束名称解释为内部生成的名称。将来,如果您需要重命名表,“tbl_name_ibfk_”将自动重命名。但是 fk_conversation_tags_tags 不会。 - GoYun.Info
4个回答

84

根据文档

ALTER TABLE语句允许在一个查询中结合多个ADDALTERDROPCHANGE子句,用逗号分隔。这是MySQL对标准SQL的扩展,标准SQL仅允许每个ALTER TABLE语句包含每种子句各一次。

这样,您可以将删除和重新创建组合成一个查询,这样应该比在两个查询中先删除约束再创建更快:

ALTER TABLE conversation_tags
DROP FOREIGN KEY `conversation_tags_ibfk_1`,
ADD CONSTRAINT `fk_conversation_tags_tags` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`);

显然,这个答案比最初被接受的答案要新得多,但它也是一个更好的答案。 - RET
有没有一种方法可以使用通配符重命名所有约束名称,例如将abc_foo_*重命名为abc_bar_*? - Dave
2
在“DROP FOREIGN…”行中,使用`而不是'。 - HeavyE

9

非常抱歉,但在mySQL中只能删除和重新附加约束条件。


3

在mysql ALTER TABLE语法中似乎没有这个功能。

然而,在Oracle中支持此功能。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接