294

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

  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 查询可以用来返回:

  1. 在 X 中具有外键的表的列表
  2. 以及哪些表实际上在外键中有值
4

8 回答 8

410

干得好:

USE information_schema;
SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id';

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

SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id'
  AND TABLE_SCHEMA = 'your_database_name';
于 2009-07-15T19:27:30.787 回答
65

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

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;
于 2010-07-22T17:23:50.027 回答
24

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

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';
于 2013-09-16T10:35:10.803 回答
15

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

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

于 2009-04-30T13:57:38.203 回答
6

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

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

限制到表中的特定列

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'
于 2016-09-15T08:40:38.277 回答
4

我写了一个小bash onliner,您可以将其写入脚本以获得友好的输出:

mysql_references_to:

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 '.' '\n' |sed 's/,$//' |sed 's/,/./'

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

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
...
于 2015-03-11T10:23:53.660 回答
0

SELECT TABLE_NAME, COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMALIKE 'your_database' AND TABLE_SCHEMALIKE 'your_database' AND REFERENCED_TABLE_SCHEMALIKE 'your_database' AND REFERENCED_TABLE_NAMELIKE 'your_table' AND REFERENCED_COLUMN_NAMELIKE 'your_column';

于 2021-04-01T20:59:35.537 回答
-3

最简单:
1. 打开 phpMyAdmin
2. 在左侧单击数据库名称
3. 在右上角找到“设计器”选项卡

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

于 2017-12-01T07:15:04.667 回答