MySQL: Comment déterminer les relations de clé étrangère par programme?
-
07-07-2019 - |
Question
Similaire à la cette question mais pour MySQL ....
Comment puis-je déterminer par programme les références de clé étrangère dans MySQL (en supposant InnoDB)? Je peux presque les obtenir avec:
SHOW TABLE STATUS WHERE Name = 'MyTableName';
... mais hélas, la colonne de commentaires qui semble contenir certaines de ces informations est tronquée et je ne peux donc pas compter dessus. Il doit y avoir un autre moyen ...
Je serais satisfait d'un appel d'API C, d'une instruction SQL, de n'importe quoi. J'ai juste besoin de quelque chose qui fonctionne de manière cohérente.
Remarque: j'ai également envisagé d'analyser les résultats d'un "SHOW CREATE TABLE MyTableName". déclaration, mais j'espère vraiment qu'il y a quelque chose de plus simple.
La solution
Il existe deux tables que vous pouvez interroger pour obtenir ces informations: INFORMATION_SCHEMA.TABLE_CONSTRAINTS
et INFORMATION_SCHEMA.KEY_COLUMN_USAGE
.
Voici une requête tirée des commentaires de la dernière page liée ci-dessus, qui explique comment obtenir les informations recherchées.
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;
Utilisez votre nom de schéma au lieu de " test
" ci-dessus.
Autres conseils
Vous avez une petite amélioration par rapport à la solution @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;
Dans ce cas, je filtrais par relations avec le "nom_votre_table". champs et voir de quelle base de données provient la relation.
Essayez 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';