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查询:
干得好:
1 2 3 4 5 6 7 |
如果您有多个具有相似表/列名称的数据库,您可能还希望将查询限制为特定数据库:
1 2 3 4 5 6 7 |
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 |
如果要检查特定数据库中的表,请添加以下内容:
1 |
您可以在明智命名的
您可能需要检查表
列出数据库中的所有外键,包括描述
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'; |
限制到表格表中的特定列
我写了一个小的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/,/./' |
所以执行:
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"选项卡
所有约束都将在那里显示。