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.

Était-ce utile?

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';
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top