How do I see all foreign keys to a table or column?
在MySQL中,如何获取指向特定表的所有外键约束的列表?某个专栏?这和这个Oracle问题是一样的,但对于MySQL是一样的。
桌子:
1 2 3 4 5 6 7 |
专栏:
1 2 3 4 5 6 7 8 |
基本上,我们在WHERE子句中用引用的列名更改了引用的表名。
- 这总是给我一个空的集合,而下面节点提出的查询工作正常
- @急性:你确定你问的是正确的桌子吗?如果节点的查询工作正常,那么您可能会询问另一个方向(即,来自MyTable的键,而不是MyTable的键)。这会要求您使用表名编写"
",而不使用"<"和">"?
- 似乎我误解了您的查询,因为我在查询从
:)引用的键(是的,我写了表名而不是"
"xd)
- 除非您确定表名是唯一的,否则您可能还需要将查询限制到特定的数据库。将WHERE子句改为:
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable' 。- 在非根用户的情况下,即使用户对数据库拥有所有权限,这也不起作用。
- @Deepakram这对我来说非常适用,因为我的特权用户不是根用户。
- 同意,我在这里只有空的一套!安迪的回答对我最有效。
- 为什么需要这么多?为什么不像选择行那样简单呢?
- 这对我很好。我有很多特权,但不是根用户。你是个救生员。
- 我将
TABLE_SCHEMA 添加到列列表(SELECT TABLE_SCHEMA, TABLE_NAME, … )中,这对于有多个数据库具有与我们感兴趣的表/列相关的表非常有用。编辑:正如评论中指出的,这不是对ops问题的正确答案,但是了解这个命令很有用。这个问题出现在谷歌上,是为了我在寻找什么,我想我会把这个答案留给其他人去寻找。
我在这里找到了这个答案:mysql:show constraints on tables命令
我需要这样做,因为我想看看FK是如何运作的,而不是仅仅看看它是否存在。
- 这显示了
中的所有约束,而不是指向 的所有约束。 - 正如@barmar所说,这是完全错误的;它将显示属于指定表的外键,但不会显示指向该表的外键,这正是问题所要求的。不知道这是怎么得到50票赞成票的;我猜人们最终会在这里,当他们真的在寻找对立面问题的答案时,无论如何都会在这里找到他们的答案,并且在投票前不必费心阅读原始问题(甚至标题)。
- @Markamery:这是
display foreign keys mysql 在谷歌的第一个结果,可能正因为如此;) - 这实际上显示了所有存在的约束,phpmyadmin只显示指向表的约束。用ORM工具似乎可以避免重复
- 这是我要找的,所以谢谢你把它贴出来,尽管它没有回答OP的问题。知道如何看待一段关系的两个方向永远不会有伤害!
- 我喜欢这种回答,先生。
如果您使用InnoDB和定义的FK,您可以查询信息"模式数据库",例如:
1
2
3
4- 实际上,这指出了错误的方向。该查询显示所有指向"MyTable"的外键,而不是所有指向"MyTable"的外键。
- 这个在我的情况下效果更好。我需要删除表中的每个外键约束(并且只删除那些约束),以便能够更改innodb引擎myisam或ndb。
- 您可以从引用约束表获得两个方向的外键——我已经用查询添加了另一个答案。
发布旧答案以添加一些有用的信息。
我有一个类似的问题,但我也希望看到约束类型以及引用的表和列名。所以,
要查看表中的所有FK:
1
2
3
4
5
6
7
8USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';要查看模式中的所有表和FK,请执行以下操作:
1
2
3
4
5
6
7USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();要查看数据库中的所有FK,请执行以下操作:
1
2
3
4记得!
这是在使用InnoDB存储引擎。如果在添加外键之后,您似乎找不到任何要显示的外键,可能是因为您的表使用了myisam。
检查:
要修复,请使用以下命令:
- 如果在WHERE子句上指定k.table_schema=database()和k.table_name='
,那么这些查询运行得更快(从2秒到0.0015秒),如本文所述dev.mysql.com/doc/refman/5.5/en/&hellip;
- 很好的回答。你有什么解决办法吗?
- 不幸的是,myisam不支持外键。dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html版本
作为节点答案的替代方法,如果您使用InnoDB和定义的FK,则可以查询信息"模式数据库",例如:
1
2
3
4对于来自
的外键,或
1
2
3
4对于foreign key to
如果需要,还可以获取更新规则和删除规则。
- 我个人更喜欢这个答案,因为使用引用约束表可以为您提供更新和级联规则。+ 1
- 在查找表时,您不应该忘记可以通过两种方式建立外键!
此解决方案不仅将显示所有关系,还将显示约束名称,在某些情况下(例如drop contrint)是必需的:
1
2
3
4
5
6
7
8如果要检查特定数据库中的表,请在查询结束时添加架构名称:
1
2
3
4
5
6
7
8
9同样,对于特定的列名,添加
and table_name = 'table_name
在查询结束时。
灵感来源于这篇文章
使用引用的_table_name并不总是有效,可以是空值。以下查询可以替代:
使用
1
2
3
4
5
6
7
8
9
10KEY_COLUMN_USAGE view:
SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;此查询假定约束以及所有引用表和引用表都在同一架构中。
添加您自己的评论。
来源:官方MySQL手册。
查找包含特定外键(如
employee_id 的所有表1
2
3
4我提出的解决方案是脆弱的;它依赖于Django对外键的命名约定。
1
2
3
4然后,在贝壳里,
1grep 'refs_tablename_id' mysql_output如果还要获取外键列的名称:
1
2
3
4
5
6
7
8SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;
- 关于sql:如何查找具有引用特定表的外键的表
- 关于mysql:如何使用java计算SQL数据库中的外键数
- 如何列出引用SQL Server中给定表的所有外键?
- 关于外键:如何从MySQL表中删除约束?
- 关于mysql:在tables命令上显示约束
- 查看整个MySQL数据库的所有外键约束
- 关于数据库:如何查找所有mysql表之间的所有关系?
- 关于sql:查询表的外键关系
- 关于数据库:如何在mysql中查找表依赖项
- 关于信息模式:如何查找MySQL中具有特定列名的所有表?
- 关于sql server:不能截断表,因为它是由FOREIGN KEY约束引用的?
- 如何为MySQL中的多列指定唯一约束?
- 关于mysql:如何找到所有具有引用特定table.column的外键并具有这些外键值的表?
- 关于sql:具有外键的表列是否可以为NULL?
- MySQL DROP所有表,忽略外键
- 关于mysql:如何截断外键约束表?
- 如何获取MySQL数据库表的大小?
- 关于mysql:将外键添加到现有表
- 关于sql:MySQL无法添加外键约束
Copyright © 码农家园 联系:[email protected]
- 似乎我误解了您的查询,因为我在查询从