663 votes

Comment voir toutes les clés étrangères d'une table ou d'une colonne ?

Dans MySQL, comment puis-je obtenir une liste de toutes les contraintes de clé étrangère pointant vers une table particulière ? une colonne particulière ? C'est la même chose que cette question Oracle mais pour MySQL.

915voto

Vinko Vrsalovic Points 116138

Pour une table

select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where
REFERENCED_TABLE_NAME = '<table>';

pour une colonne, c'est la même chose mais on ajoute un and pour le REFERENCED_COLUMN_NAME.

34 votes

Cela me donne toujours un ensemble vide, alors que la requête proposée par Node ci-dessous fonctionne bien

7 votes

@Acute : Etes-vous sûr que vous demandez la bonne table ? Si la requête de Node fonctionne, alors vous demandez probablement dans l'autre sens (c'est-à-dire, les clés de mytable, pas les clés de mytable). Cela signifie que vous avez écrit '<table>' avec le nom de la table et sans les '<' et '>' ?

3 votes

Il semble que j'ai mal compris votre requête, car je demandais des clés se référant à la <table> :) (oui, j'ai écrit le nom de la table au lieu de "<table>" XD)

329voto

CenterOrbit Points 906

Voici un bon moyen de trouver ces informations sans passer par le schéma d'information :

SHOW CREATE TABLE `<yourtable>`;

J'ai trouvé cette réponse ici : MySQL : commande show constraints on tables

J'avais besoin de ce moyen car je voulais voir comment le FK fonctionnait, plutôt que de simplement voir s'il existait ou non.

44 votes

Cela montre toutes les contraintes dans <yourtable> pas toutes les contraintes qui pointent vers <yourtable> .

22 votes

Comme le dit @Barmar, c'est tout à fait faux ; cela montrera les clés étrangères appartenant à la table spécifiée, mais ne montrera pas les clés étrangères qui pointent. À la table, ce qui est ce que la question demande. Je ne sais pas comment cette question a obtenu 50 votes positifs ; je suppose que les gens ont atterri ici alors qu'ils cherchaient en fait la réponse à la question opposée, ont trouvé leur réponse ici de toute façon, et n'ont pas pris la peine de lire la question originale (ou même son titre) avant de voter.

2 votes

@MarkAmery : c'est le premier résultat de display foreign keys mysql dans google, c'est peut-être pour cela ;)

88voto

Node Points 7859

Si vous utilisez InnoDB et des FK définis, vous pouvez interroger la base de données information_schema, par exemple :

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';

18 votes

En fait, cette requête montre toutes les clés étrangères qui pointent depuis 'mytable', et non toutes les clés étrangères qui pointent vers 'mytable'.

1 votes

Celui-ci fonctionne mieux dans mon cas. J'ai besoin de supprimer chaque contrainte de clé étrangère (et seulement celles-là) d'une table pour pouvoir changer le moteur InnoDB MyISAM ou NDB.

0 votes

Vous pouvez obtenir des clés étrangères dans les deux sens à partir de la table REFERENTIAL_CONSTRAINTS - j'ai ajouté une autre réponse avec la requête.

51voto

Yes Points 218

Je poste sur une ancienne réponse pour ajouter quelques informations utiles.

J'ai eu un problème similaire, mais je voulais également voir le CONSTRAINT_TYPE ainsi que les noms des tables et des colonnes REFERENCEES. Ainsi,

  1. Pour voir tous les FKs dans votre table :

    USE '<yourschema>';
    
    SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND i.TABLE_SCHEMA = DATABASE()
    AND i.TABLE_NAME = '<yourtable>';
  2. Pour voir toutes les tables et les FKs de votre schéma :

    USE '<yourschema>';
    
    SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND i.TABLE_SCHEMA = DATABASE();
  3. Pour voir tous les FKs dans votre base de données :

    SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';

Rappelez-vous !

Ce système utilise le moteur de stockage InnoDB. Si vous ne parvenez pas à faire apparaître les clés étrangères après les avoir ajoutées, c'est probablement parce que vos tables utilisent MyISAM.

Pour vérifier :

SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';

Pour réparer, utilisez ceci :

ALTER TABLE `<yourtable>` ENGINE=InnoDB;

8 votes

Ces requêtes s'exécutent beaucoup plus rapidement (de 2 secondes à 0,0015 secondes) si vous spécifiez k.TABLE_SCHEMA = DATABASE() et k.TABLE_NAME = '<table>' dans la clause WHERE, comme documenté ici dev.mysql.com/doc/refman/5.5/fr/

2 votes

Excellente réponse. Avez-vous des solutions pour MyISAM ?

2 votes

MyISAM ne prend pas en charge les clés étrangères, malheureusement. dev.mysql.com/doc/refman/5.7/fr/myisam-storage-engine.html

10voto

user1837811 Points 121

La façon la plus simple de voir toutes les clés étrangères

SHOW CREATE TABLE table_name;

Ceci montrera tout le détail de la table nommée tbl_name .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X