MySQL: как программно определить отношения внешнего ключа?

Как и этот вопрос, но для MySQL....

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

SHOW TABLE STATUS WHERE Name = 'MyTableName';

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

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

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

Ответы

Ответ 1

Есть две таблицы, которые вы можете запросить для получения этой информации: 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' выше.

Ответ 2

Здесь вы немного улучшились по сравнению с решением @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 и видя, из какой базы данных происходит связь.

Ответ 3

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

Ответ 4

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';