如何查找具有引用特定table.column的外键的所有表以及这些外键的值?

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

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`) ) 

现在,我不知道在数据库中有多less表包含像X和Y这样的X的外键。是否有一个SQL查询可以用来返回:

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

干得好:

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

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

 SELECT ke.referenced_table_name parent, ke.table_name child, ke.constraint_name FROM information_schema.KEY_COLUMN_USAGE ke WHERE ke.referenced_table_name IS NOT NULL ORDER BY ke.referenced_table_name; 

这个解决scheme不仅会显示所有的关系,而且还会显示约束名称,这在某些情况下是必需的(例如放置约束):

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

您可以在明智的名为information_schema表中find所有模式相关的信息。

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

尝试这个:

 USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'table_name' AND REFERENCED_COLUMN_NAME = 'table_field'; 

这对我有效。

我写了一个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 ... 

查找具有引用特定表>列的外键的所有表

 SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'persone' AND REFERENCED_COLUMN_NAME = 'pno'; 

列出包含描述的db中的所有外键

  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'