当前位置:  开发笔记 > 后端 > 正文

如何查看表或列的所有外键?

如何解决《如何查看表或列的所有外键?》经验,为你挑选了7个好方法。

在MySQL中,如何获取指向特定表的所有外键约束的列表?一个特定的专栏?这与Oracle问题相同,但对MySQL而言.



1> Vinko Vrsalo..:

对于表:

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '' AND
  REFERENCED_TABLE_NAME = '';

对于一列:

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '' AND
  REFERENCED_TABLE_NAME = '
' AND REFERENCED_COLUMN_NAME = '';

基本上,我们在where子句中使用REFERENCED_COLUMN_NAME更改了REFERENCED_TABLE_NAME.


这总是给我一个空集,而下面的Node提出的查询工作正常
@Acute:你确定要询问正确的桌子吗?如果Node的查询有效,那么你可能会询问另一个方向(即,来自mytable的键,而不是to mytable的键.)这期望你用表名写了'
'而没有'<'和'>' ?
除非您确定表名是唯一的,否则您可能也希望将查询限制在特定数据库中.将where子句更改为:`其中REFERENCED_TABLE_SCHEMA ='mydatabase'和REFERENCED_TABLE_NAME ='mytable'
好像我误解你的查询,因为我查询键引用从
:)(是的,我写的,而不是"
" XD表名)

2> CenterOrbit..:

编辑:正如在评论中指出,这不是正确答案OP的问题,但它是有用的知道这个命令.这个问题出现在谷歌我正在寻找的东西,并认为我留下这个答案让其他人找到.

SHOW CREATE TABLE ``;

我在这里找到了这个答案: MySQL:对表命令显示约束

我需要这种方式,因为我想看看FK是如何运作的,而不仅仅是看它是否存在.


这显示了``中的所有约束,而不是所有指向``的约束.
正如@Barmar所说,这是完全错误的; 它将显示属于指定表的外键,但不会显示指向表格的外键,这是问题所要求的.不知道这是如何获得50票的; 我猜人们真的在这里找到了相反问题的答案,无论如何都找到了他们的答案,并且在提出之前并没有费心阅读原始问题(甚至是标题).
这就是我所寻找的,所以感谢发布它,即使它没有回答OP的问题.永远不会伤害知道如何在关系中向两个方向看!
@MarkAmery:这是谷歌"显示外键mysql"的第一个结果,可能就是这个原因;)

3> Node..:

如果您使用InnoDB并定义了FK,您可以查询information_schema数据库,例如:

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';


实际上,这指向了错误的方向.该查询显示指向FROM'mytable'的所有外键,而不是所有指向''mytable'的外键.

4> Andy..:

发布旧答案以添加一些有用的信息.

我有类似的问题,但我也希望看到CONSTRAINT_TYPE以及REFERENCED表和列名.所以,

    要查看表格中的所有FK:

    USE '';
    
    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 = '';
    

    要查看模式中的所有表和FK:

    USE '';
    
    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:

    SELECT i.TABLE_SCHEMA, 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';
    

记得!

这是使用InnoDB存储引擎.如果你在添加它们之后似乎无法显示任何外键,那可能是因为你的表正在使用MyISAM.

去检查:

SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '';

要修复,请使用:

ALTER TABLE `` ENGINE=InnoDB;


如果在WHERE子句中指定k.TABLE_SCHEMA = DATABASE()和k.TABLE_NAME ='
',则这些查询运行得更快(从2秒到0.0015秒),如此处所述http://dev.mysql.com /doc/refman/5.5/en/information-schema-optimization.html
很好的答案.你有MyISAM的解决方案吗?
不幸的是,MyISAM不支持外键.http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

5> ChrisV..:

作为Node的答案的替代方案,如果你使用InnoDB并定义了FK,你可以查询information_schema数据库,例如:

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = ''
AND TABLE_NAME = '
'

来自

的外键,或

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = ''
AND REFERENCED_TABLE_NAME = '
'

对于

的外键

如果需要,还可以获取UPDATE_RULE和DELETE_RULE.


我个人更喜欢这个答案,因为使用REFERENTIAL_CONSTRAINTS表可以获得更新和级联规则.+1

6> Panayotis..:

此解决方案不仅会显示所有关系,还会显示约束名称,这在某些情况下是必需的(例如,丢弃约束):

select
    concat(table_name, '.', column_name) as 'foreign key',
    concat(referenced_table_name, '.', referenced_column_name) as 'references',
    constraint_name as 'constraint name'
from
    information_schema.key_column_usage
where
    referenced_table_name is not null;

如果要检查特定数据库中的表,请在查询末尾添加模式名称:

select
    concat(table_name, '.', column_name) as 'foreign key',
    concat(referenced_table_name, '.', referenced_column_name) as 'references',
    constraint_name as 'constraint name'
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'database_name';

同样,对于特定的列名称,请添加

和table_name ='table_name

在查询结束时.

通过这篇文章的启发这里



7> Hazok..:

使用REFERENCED_TABLE_NAME并不总是有效,并且可以为NULL值。以下查询可以代替:

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '
';

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有