关于mysql:如何查看表或列的所有外键?

How do I see all foreign keys to a table or column?

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


桌子:

1
2
3
4
5
6
7
SELECT
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_TABLE_NAME = '<table>';

专栏:

1
2
3
4
5
6
7
8
SELECT
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_TABLE_NAME = '<table>' AND
  REFERENCED_COLUMN_NAME = '<column>';

基本上,我们在WHERE子句中用引用的列名更改了引用的表名。

我在这里找到了这个答案:mysql:show constraints on tables命令

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


如果您使用InnoDB和定义的FK,您可以查询信息"模式数据库",例如:

1
2
3
4
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';


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

我有一个类似的问题,但我也希望看到约束类型以及引用的表和列名。所以,

  • 要查看表中的所有FK:

    1
    2
    3
    4
    5
    6
    7
    8
    USE '<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
    7
    USE '<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
    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。

    检查:

    1
    SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';

    要修复,请使用以下命令:

    1
    ALTER TABLE `<yourtable>` ENGINE=InnoDB;

    对于来自

    的外键,或

    1
    2
    3
    4
    SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
    FROM information_schema.REFERENTIAL_CONSTRAINTS
    WHERE CONSTRAINT_SCHEMA = '<schema>'
    AND REFERENCED_TABLE_NAME = '<table>'

    对于foreign key to

    如果需要,还可以获取更新规则和删除规则。


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

    1
    2
    3
    4
    5
    6
    7
    8
    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;

    如果要检查特定数据库中的表,请在查询结束时添加架构名称:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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';

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

    and table_name = 'table_name

    在查询结束时。

    灵感来源于这篇文章


    使用引用的_table_name并不总是有效,可以是空值。以下查询可以替代:

    1
    select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';

    使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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手册。


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

    1
    2
    3
    4
    SELECT DISTINCT TABLE_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('employee_id')
    AND TABLE_SCHEMA='table_name';

    我提出的解决方案是脆弱的;它依赖于Django对外键的命名约定。

    1
    2
    3
    4
    USE information_schema;
    tee mysql_output
    SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
    notee

    然后,在贝壳里,

    1
    grep 'refs_tablename_id' mysql_output

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

    1
    2
    3
    4
    5
    6
    7
    8
    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 = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
     ORDER BY i.TABLE_NAME;