mysql怎么查看所有的外键_mysql - 如何查看表或列的所有外键?

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

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

11个解决方案

613 votes

对于表:

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

REFERENCED_COLUMN_NAME = '';

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

Vinko Vrsalovic answered 2019-01-10T05:33:02Z

211 votes

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

SHOW CREATE TABLE ``;

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

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

CenterOrbit answered 2019-01-10T05:33:38Z

64 votes

如果您使用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';

Node answered 2019-01-10T05:34:01Z

36 votes

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

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

要查看表格中的所有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';

要查看模式中的所有表和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';

要查看数据库中的所有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;

Andy answered 2019-01-10T05:35:28Z

20 votes

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

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME

FROM information_schema.REFERENTIAL_CONSTRAINTS

WHERE CONSTRAINT_SCHEMA = ''

AND TABLE_NAME = '

对于来自< table>的外键,或

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME

FROM information_schema.REFERENTIAL_CONSTRAINTS

WHERE CONSTRAINT_SCHEMA = ''

AND REFERENCED_TABLE_NAME = '

对于< table>的外键

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

ChrisV answered 2019-01-10T05:36:09Z

8 votes

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

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

在查询结束时。

灵感来自这篇文章

Panayotis answered 2019-01-10T05:37:05Z

3 votes

使用。快速列出您的FK(外键引用)的方法

KEY_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手册。

Daniel Rodas answered 2019-01-10T05:37:50Z

3 votes

查找包含特定外键的所有表,例如employee_id

SELECT DISTINCT TABLE_NAME

FROM INFORMATION_SCHEMA.COLUMNS

WHERE COLUMN_NAME IN ('employee_id')

AND TABLE_SCHEMA='table_name';

Anthony Vipond answered 2019-01-10T05:38:12Z

2 votes

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

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '

Hazok answered 2019-01-10T05:38:34Z

1 votes

我想出的解决方案很脆弱; 它依赖于django对外键的命名约定。

USE information_schema;

tee mysql_output

SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';

notee

然后,在shell中,

grep 'refs_tablename_id' mysql_output

Christian Oudard answered 2019-01-10T05:39:03Z

0 votes

如果您还想获取外键列的名称:

SELECT 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 = '' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'

ORDER BY i.TABLE_NAME;

omarjebari answered 2019-01-10T05:39:25Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值