MySQL: Как программно определить отношения с внешним ключом?
-
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';