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