【问题标题】:How do I see which columns throughout my database reference one particular column as a foreign key? Like a "reverse" foreign key?如何查看整个数据库中的哪些列引用一个特定列作为外键?像“反向”外键?
【发布时间】:2013-06-30 11:48:34
【问题描述】:

我有一个相当大的关系数据库,并且正在处理管理后端。我想知道哪些表引用了一个特定表中的列。

例如:假设我有一个表products,其中id 作为主索引。我可以有很多引用该索引的表,例如orders 表、user_bookmarks 表和product_reviews 表。如果我想删除一个特定的产品,我首先需要对其他表做一些工作——一个简单的“级联”或“删除”指令是不够的。如何让 MySQL 准确地告诉我哪些表中的哪些列引用了 products.id 索引?

额外问题:是否有使用 phpmyadmin 获取此信息的内置方法?

【问题讨论】:

    标签: mysql phpmyadmin foreign-keys


    【解决方案1】:
    SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE (REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME) = ('mydatabase', 'products')
    

    你的评论:

    MySQL 不支持递归查询,因此很遗憾,无法在单个查询中找到完整的外键图。您可以做的最好的事情是对于上述查询的每个结果,再次运行查询,将 TABLE_SCHEMA 和 TABLE_NAME 替换为 WHERE 子句中的字符串常量(如果您有循环外键,请注意不要进入无限循环) .

    【讨论】:

    • 那是完美的。谢谢。
    • 实际上,是否可以更进一步,创建一个“树”来显示结果的外键约束?继续我的示例,如果product_reviews 引用products.id,它还会显示哪些表引用product_reviews?对不起,如果这要求太多了=P
    【解决方案2】:

    你能不能不把数据库中的Schema读入MySQL Workbench,然后用工具画出表之间的关系?我自己没有尝试过,因为我在 MySQL Workbench 中进行设计,然后进行映射等...然后导出到 MySQL 以创建数据库。

    【讨论】:

    • 啊,是的,我没有想到这一点。也很好回答。数据库部署完成后,您还使用 Workbench 吗?您如何对数据库进行更改?
    • 我仍然使用 Workbench 进行所有模式编辑和文档。但是,由于我不是每次都创建新数据库,因此部署发生了变化。我使用了其他脚本来部署,它通常比较两个表(现有的与新定义的)并使用新定义作为简单的 ALTER TABLE 语句更新现有表。
    • 在 MySQL Workbench 页面上阅读,现在似乎有同步功能,但我没有使用它。我无法评论它的有效性,但我已经使用了 Microsoft SQL Server,它的脚本工具将向您展示如何通过 SQL 语句更改表,然后您可以将其提交到服务器(当然是 SQL Server)。因此,我假设 MySQL Workbench 也可以很好地做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2013-12-26
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多