MySQL: Как программно определить отношения с внешним ключом? - PullRequest
14 голосов
/ 08 ноября 2008

Похоже на этот вопрос но для MySQL ....

Как я могу программно определять ссылки на внешние ключи в MySQL (при условии InnoDB)? Я могу почти получить их с помощью:

SHOW TABLE STATUS WHERE Name = 'MyTableName';

... но, увы, столбец комментариев, который, кажется, содержит часть этой информации, усекается, поэтому я не могу на это полагаться. Должен быть какой-то другой путь ...

Я был бы доволен вызовом C API, оператором SQL, чем угодно - мне просто нужно что-то, что последовательно работает.

Примечание: я также рассмотрел анализ результатов оператора "SHOW CREATE TABLE MyTableName", но я действительно надеюсь, что есть что-то более простое.

Ответы [ 4 ]

29 голосов
/ 08 ноября 2008

Для получения этой информации вы можете запросить две таблицы: INFORMATION_SCHEMA.TABLE_CONSTRAINTS и INFORMATION_SCHEMA.KEY_COLUMN_USAGE.

Вот запрос из комментариев на последней странице, указанной выше, который демонстрирует, как получить искомую информацию.

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 = 'test' 
  AND referenced_table_name IS NOT NULL 
ORDER BY table_name, column_name;

Используйте имя вашей схемы вместо 'test' выше.

7 голосов
/ 08 августа 2012

Здесь у вас есть небольшое улучшение по сравнению с решением @bill:

SELECT CONSTRAINT_SCHEMA AS db,
       CONCAT (
           TABLE_NAME,
           '.',
           COLUMN_NAME,
           ' -> ',
           REFERENCED_TABLE_NAME,
           '.',
           REFERENCED_COLUMN_NAME
       ) AS relationship 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'your_table_name'
ORDER BY CONSTRAINT_SCHEMA,
         TABLE_NAME,
         COLUMN_NAME;

В этом случае я выполнял фильтрацию по отношениям с полями "your_table_name" и прослеживал, из какой базы данных происходят отношения.

2 голосов
/ 08 ноября 2008

Попробуйте INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

0 голосов
/ 31 мая 2016
SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'table_name'
      AND TABLE_SCHEMA = 'table_schema';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...