В MySQL, как мне получить список всех ограничений внешнего ключа, указывающих на определенную таблицу? конкретный столбец? Это то же самое, что этот вопрос Oracle, но для MySQL.
Как просмотреть все внешние ключи таблицы или столбца?
Ответ 1
Для таблицы:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
Для столбца:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
По сути, мы изменили REFERENCED_TABLE_NAME на REFERENCED_COLUMN_NAME в предложении where.
Ответ 2
EDIT: Как указано в комментариях, это не правильный ответ на вопрос OPs, но полезно знать эту команду. Этот вопрос появился в Google за тем, что я искал, и решил, что оставлю этот ответ другим, чтобы найти.
SHOW CREATE TABLE `<yourtable>`;
Я нашел этот ответ здесь: MySQL: показать ограничения на команду таблиц
Мне нужен этот путь, потому что я хотел посмотреть, как работает FK, а не просто увидеть, существует ли он или нет.
Ответ 3
Если вы используете InnoDB и определенный FK, вы можете запросить базу данных information_schema, например:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';
Ответ 4
Публикация старого ответа для добавления полезной информации.
У меня была аналогичная проблема, но мне также хотелось увидеть CONSTRAINT_TYPE вместе с именами таблиц и столбцов REFERENCED. Таким образом,
-
Чтобы увидеть все FK в таблице:
USE '<yourschema>'; SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' AND i.TABLE_SCHEMA = DATABASE() AND i.TABLE_NAME = '<yourtable>';
-
Чтобы увидеть все таблицы и FK в вашей схеме:
USE '<yourschema>'; SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' AND i.TABLE_SCHEMA = DATABASE();
-
Чтобы увидеть все FK в вашей базе данных:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM information_schema.TABLE_CONSTRAINTS i LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
Помните!
Это использует движок хранения InnoDB. Если вы не можете заставить какие-либо внешние ключи появляться после добавления их, это, вероятно, потому, что ваши таблицы используют MyISAM.
Чтобы проверить:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Чтобы исправить, используйте это:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Ответ 5
В качестве альтернативы ответу Node, если вы используете InnoDB и определенные FK, вы можете запросить базу данных information_schema, например:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
для внешних ключей из <table> , или
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
для внешних ключей в <table>
Вы также можете получить UPDATE_RULE и DELETE_RULE, если хотите.
Ответ 6
Это решение будет отображать не только все отношения, но также и имя ограничения, которое требуется в некоторых случаях (например, ограничение на удаление):
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;
Если вы хотите проверить таблицы в конкретной базе данных, в конце запроса добавьте имя схемы:
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';
Аналогично, для конкретного имени столбца добавьте
и table_name = 'table_name
в конце запроса.
Вдохновленный этим постом здесь
Ответ 7
Использование REFERENCED_TABLE_NAME не всегда работает и может быть значением NULL. Вместо этого может работать следующий запрос:
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';
Ответ 8
Быстрый способ перечислить ваши FK (ссылки внешнего ключа) с помощью
KEY_COLUMN_USAGE view:
SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
В этом запросе предполагается, что ограничения и все ссылочные и ссылочные таблицы находятся в одной и той же схеме.
Добавьте свой собственный комментарий.
Источник: официальное руководство mysql.
Ответ 9
Решение, которое я придумал, является хрупким; он полагается на соглашение об именах django для внешних ключей.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Тогда в оболочке
grep 'refs_tablename_id' mysql_output
Ответ 10
Чтобы найти все таблицы , содержащие конкретный внешний ключ, например employee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Ответ 11
Если вы также хотите получить имя столбца внешнего ключа:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;