【问题标题】:How do I rename a foreign key in mysql?如何在mysql中重命名外键?
【发布时间】:2011-09-05 11:47:44
【问题描述】:

我们刚刚在一个大表上完成了长时间运行的迁移,并最终对我们的 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`)

删除和重新添加约束意味着另外两个长查询。有没有办法在单个查询中重命名约束?

【问题讨论】:

  • InnoDB 将以字符串“tbl_name_ibfk_”开头的外键约束名称解释为内部生成的名称。以后如果需要重命名表,“tbl_name_ibfk_”会自动重命名。但 fk_conversation_tags_tags 不会。

标签: mysql foreign-keys


【解决方案1】:

来自documentation

多个 ADDALTERDROPCHANGE 子句可以在一个 单个 ALTER TABLE 语句,以逗号分隔。 这是一个 MySQL 对标准 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`);

【讨论】:

  • 显然,这是一个比最初接受的答案更近的答案,但它也是一个更好的答案。
  • 有没有办法将所有带通配符的约束名称重命名为 abc_foo_* 为 abc_bar_* ?
  • 在“DROP FOREIGN...”行中,使用 ` 而不是 '。
【解决方案2】:

对不起,约束只能在 mySQL 中删除和重新附加

【讨论】:

    【解决方案3】:

    mysql ALTER TABLE 语法中似乎没有该功能。

    但它支持 Oracle。

    【讨论】:

      【解决方案4】:

      请参考我在MySQL terminology "constraints" vs "foreign keys" difference? 中的回答,以了解为什么约束名称与您想要的不同。 但是,MySQL 没有重命名约束功能,因此需要使用所需的名称 DROP 和 ADD FK。 https://dev.mysql.com/doc/refman/5.5/en/alter-table.html

      【讨论】:

        猜你喜欢
        • 2011-01-02
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        相关资源
        最近更新 更多