Как найти все таблицы с внешними ключами, которые ссылаются на конкретный 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`)
)
Теперь я не знаю, сколько таблиц в базе данных содержит внешние ключи в X, как таблицы Y и Z. Есть ли SQL-запрос, который я могу использовать для возврата:
- Список таблиц с внешними ключами в X
- И какая из этих таблиц действительно имеет значения во внешнем ключе
Ответы
Ответ 1
Здесь вы идете:
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';
Ответ 2
Справочное руководство 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;
Ответ 3
Это решение не только отобразит все отношения, но также и имя ограничения, которое требуется в некоторых случаях (например, ограничение на падение):
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';
Ответ 4
Вы можете найти всю информацию, связанную с схемой, в соответствии с таблицей information_schema
.
Возможно, вы захотите проверить таблицу REFERENTIAL_CONSTRAINTS
и KEY_COLUMN_USAGE
. Первый говорит вам, на какие таблицы ссылаются другие; последний расскажет вам, как связаны их поля.
Ответ 5
Попробуйте следующее:
USE information_schema;
SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'table_name' AND
REFERENCED_COLUMN_NAME = 'table_field';
Это сработало для меня.
Ответ 6
Я написал немного bash onliner, чтобы вы могли написать script, чтобы получить дружественный вывод:
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
...
Ответ 7
Найти все таблицы с внешними ключами, которые ссылаются на определенную таблицу > column
SELECT *
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_NAME = 'persone'
AND REFERENCED_COLUMN_NAME = 'pno';
Ответ 8
Перечисление всех внешних ключей в 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'
Ответ 9
Самый простой:
1. Откройте phpMyAdmin
2. В левой части базы данных щелкните имя базы данных
3. В правом верхнем углу найдите вкладку "Дизайнер"
Здесь будут показаны все ограничения.