MySQL: 如何查找引用特定表的表?

53

我想删除一张表,但是它被一个或多个其他表所引用。如何找出哪些表正在引用这个表,而不必逐个查看数据库中的每个表?


3
虽然这个问题比https://dev59.com/jXRA5IYBdhLWcg3w1BqW 更早被提出并回答了,但那个问题获得的投票比这个问题多。 - Fr0zenFyr
8个回答

102
SELECT TABLE_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'your_schema_name'
      AND REFERENCED_TABLE_NAME = 'your_table_name';

这个有效。


2
对于新手来说,“TABLE_SCHEMA”基本上就是你的数据库名称。 - jave.web

12
select table_name 
from information_schema.referential_constraints 
where referenced_table_name = 'parent table here';

信息模式中不存在表referential_constraints。我在这个数据库中寻找答案,但找不到。MySQL版本为5.0.51a-24-log(Debian)。 - seppy

2
如果您安装了phpMyAdmin,您可以使用其设计师功能来可视化表格关系。

enter image description here

要使用设计器,请选择一个数据库,然后找到设计器选项卡。


0
你可以尝试使用MySQL Workbench,它允许你提取E.R.图。在这里,你可以找到关于你的数据库表的所有需要的信息。

-1
如果您想要找到引用的特定列,请使用以下查询语句。
SELECT 
ku.CONSTRAINT_NAME AS "Foreign key",
CONCAT("`", ku.TABLE_SCHEMA, "`.`", ku.TABLE_NAME, "`") AS "In",
GROUP_CONCAT(ku.COLUMN_NAME) AS "Source column",
CONCAT("`", ku.REFERENCED_TABLE_SCHEMA, "`.`", ku.REFERENCED_TABLE_NAME, "`") AS 
"References",
GROUP_CONCAT(ku.REFERENCED_COLUMN_NAME) AS "Target column"
FROM information_schema.KEY_COLUMN_USAGE AS ku
WHERE ku.REFERENCED_TABLE_SCHEMA = '[THE_CURRENT_SELECTED_SCHEMA_NAME]'
AND ku.REFERENCED_TABLE_NAME = '[THE_CURRENT_SELECTED_TABLE_NAME]'
GROUP BY ku.CONSTRAINT_NAME
HAVING `In` != `References`

enter image description here


这个解决方案太长了。 - Belkacem Thiziri
如果能加入一些简化的内容,我会点赞的。 - Belkacem Thiziri
@BelkacemThiziri,我已添加了一张图片,清楚地显示了这个查询将显示什么内容,尽管查询可能看起来很长,但最终结果非常美观。 - Rajon Tanducar

-1

如果您正在使用innoDB,请尝试以下命令:SHOW TABLE STATUS FROM yourdatabasename LIKE 'T'http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html - Srikar Doddi

-1

查看 information_schema 模式下的 KEY_COLUMN_USAGE 表。


-1

从mysql命令行:

show table status


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