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

后端 未结 13 824
忘了有多久
忘了有多久 2020-11-22 09:14

In MySQL, how do I get a list of all foreign key constraints pointing to a particular table? a particular column? This is the same thing as this Oracle question, but for MyS

相关标签:
13条回答
  • 2020-11-22 09:18

    Using REFERENCED_TABLE_NAME does not always work and can be a NULL value. The following query can work instead:

    select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';
    
    0 讨论(0)
  • 2020-11-22 09:24

    A quick way to list your FKs (Foreign Key references) using the

    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;
    

    This query does assume that the constraints and all referenced and referencing tables are in the same schema.

    Add your own comment.

    Source: the official mysql manual.

    0 讨论(0)
  • 2020-11-22 09:26

    The solution I came up with is fragile; it relies on django's naming convention for foreign keys.

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

    Then, in the shell,

    grep 'refs_tablename_id' mysql_output
    
    0 讨论(0)
  • 2020-11-22 09:28

    For a Table:

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

    For a Column:

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

    Basically, we changed REFERENCED_TABLE_NAME with REFERENCED_COLUMN_NAME in the where clause.

    0 讨论(0)
  • 2020-11-22 09:31

    EDIT: As pointed out in the comments, this is not the correct answer to the OPs question, but it is useful to know this command. This question showed up in Google for what I was looking for, and figured I'd leave this answer for the others to find.

    SHOW CREATE TABLE `<yourtable>`;
    

    I found this answer here: MySQL : show constraints on tables command

    I needed this way because I wanted to see how the FK functioned, rather than just see if it existed or not.

    0 讨论(0)
  • 2020-11-22 09:32

    If you also want to get the name of the foreign key column:

    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;
    
    0 讨论(0)
提交回复
热议问题