Как просмотреть все foreign keys таблицы или столбца?

В MySQL, как мне получить список всех ограничений внешнего ключа, указывающих на определенную таблицу? конкретный столбец? Это то же самое, что и этот вопрос Oracle , но для MySQL.

Для таблицы:

SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '' AND REFERENCED_TABLE_NAME = '';

Для столбца:

 SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '' AND REFERENCED_TABLE_NAME = '' AND REFERENCED_COLUMN_NAME = '';

В основном мы изменили REFERENCED_TABLE_NAME с REFERENCED_COLUMN_NAME в предложении where.

EDIT: Как указано в комментариях, это не правильный ответ на вопрос OPs, но полезно знать эту команду. Этот вопрос появился в Google за тем, что я искал, и решил, что оставлю этот ответ другим.

 SHOW CREATE TABLE ``; 

Я нашел этот ответ здесь: MySQL: показать ограничения на команду таблиц

Мне так нужен, потому что я хотел посмотреть, как функционирует FK, а не просто увидеть, существует ли она или нет.

Если вы используете 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'; 

Проводка по старому ответу для добавления полезной информации.

У меня была аналогичная проблема, но мне также хотелось увидеть CONSTRAINT_TYPE вместе с именами таблиц и столбцов REFERENCED. Так,

  1. Чтобы увидеть все FK в таблице:

     USE ''; 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 = ''; 
  2. Чтобы увидеть все таблицы и FK в вашей схеме:

     USE ''; 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(); 
  3. Чтобы увидеть все 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. Если вы не можете заставить какие-либо foreign keys появляться после добавления их, это, вероятно, потому, что ваши таблицы используют MyISAM.

Проверять:

 SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = ''; 

Чтобы исправить это, используйте следующее:

 ALTER TABLE `` ENGINE=InnoDB; 

В качестве альтернативы ответу Узла, если вы используете InnoDB и определенные FK, вы можете запросить базу данных information_schema, например:

 SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = '' AND TABLE_NAME = ''

для внешних ключей из

, или

 SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = '' AND REFERENCED_TABLE_NAME = ''

для внешних ключей

Вы также можете получить UPDATE_RULE и DELETE_RULE, если хотите.

Это решение будет не только отображать все отношения, но также и имя ограничения, которое требуется в некоторых случаях (например, ограничение на падение):

 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

в конце запроса.

Вдохновленный этим сообщением здесь

Быстрый способ перечислить ваши 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.

Чтобы найти все таблицы, содержащие определенный внешний ключ, например employee_id

 SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('employee_id') AND TABLE_SCHEMA='table_name'; 

Использование REFERENCED_TABLE_NAME не всегда работает и может быть значением NULL. Вместо этого может работать следующий запрос:

 select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '';

Решение, которое я придумал, является хрупким; он полагается на соглашение об именах 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 

Если вы также хотите получить имя столбца внешнего ключа:

 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 = '' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY i.TABLE_NAME; 
Interesting Posts
Давайте будем гением компьютера.