关于mysql:如何找到所有具有引用特定table.column的外键并具有这些外键值的表?

How to find all tables that have foreign keys that reference particular table.column and have values for those foreign keys?

我有一个表,其主键在其他几个表中作为外键引用。 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY  (`X_id`)
  )
  CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Y_id`),
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )
  CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Z_id`),
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )

现在,我不知道数据库中有多少表包含X中的外键,如表Y和Z.是否有可用于返回的SQL查询:

  • 包含外键到X的表的列表
  • 和哪些表实际上在外键中有值

  • 干得好:

    1
    2
    3
    4
    5
    6
    7
    USE information_schema;
    SELECT *
    FROM
      KEY_COLUMN_USAGE
    WHERE
      REFERENCED_TABLE_NAME = 'X'
      AND REFERENCED_COLUMN_NAME = 'X_id';

    如果您有多个具有相似表/列名称的数据库,您可能还希望将查询限制为特定数据库:

    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM
      KEY_COLUMN_USAGE
    WHERE
      REFERENCED_TABLE_NAME = 'X'
      AND REFERENCED_COLUMN_NAME = 'X_id'
      AND TABLE_SCHEMA = 'your_database_name';


    MySQL 5.5参考手册:"InnoDB和FOREIGN KEY约束"

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
      ke.REFERENCED_TABLE_SCHEMA parentSchema,
      ke.referenced_table_name parentTable,
      ke.REFERENCED_COLUMN_NAME parentColumnName,
      ke.TABLE_SCHEMA ChildSchema,
      ke.table_name childTable,
      ke.COLUMN_NAME ChildColumnName
    FROM
      information_schema.KEY_COLUMN_USAGE ke
    WHERE
      ke.referenced_table_name IS NOT NULL
      AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key
    ORDER BY
      ke.referenced_table_name;


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

    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
    AND table_schema = 'database_name';

    您可以在明智命名的information_schema表中找到所有与架构相关的信息。

    您可能需要检查表REFERENTIAL_CONSTRAINTSKEY_COLUMN_USAGE。前者告诉你哪些表被其他人引用;后者会告诉你他们的领域是如何相关的。


    列出数据库中的所有外键,包括描述

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        SELECT  
        i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME,
        i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME,
        i2.UPDATE_RULE, i2.DELETE_RULE
        FROM  
        information_schema.KEY_COLUMN_USAGE AS i1  
        INNER JOIN
        information_schema.REFERENTIAL_CONSTRAINTS AS i2
        ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
        WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL  
        AND  i1.TABLE_SCHEMA  ='db_name';

    限制到表格表中的特定列

    1
    AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'

    我写了一个小的bash onliner,你可以写一个脚本来获得一个友好的输出:

    mysql_references_to:

    1
    2
    mysql -uUSER -pPASS -A DB_NAME -se"USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep"\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd"," -| tr '.' '
    '
    |sed 's/,$//' |sed 's/,/./'

    所以执行:mysql_references_to transaccion(其中transaccion是一个随机表名)给出如下输出:

    1
    2
    3
    4
    5
    6
    7
    carrito_transaccion.transaccion_id
    comanda_detalle.transaccion_id
    comanda_detalle_devolucion.transaccion_positiva_id
    comanda_detalle_devolucion.transaccion_negativa_id
    comanda_transaccion.transaccion_id
    cuenta_operacion.transaccion_id
    ...


    最简单的:
    1.打开phpMyAdmin
    2.在左键单击数据库名称
    3.在右上角找到"Designer"选项卡

    所有约束都将在那里显示。