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

StackOverflow https://stackoverflow.com/questions/273794

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

SHOW TABLE STATUS WHERE Name = 'MyTableName';

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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';
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top