MySQL: Comment vérifier les clés étrangères liées à une table

43

Comment voir les clés étrangères liées à une table dans MySql?

Fond : Je voulais supprimer une table dans MySql qui a une contrainte de clé étrangère. Quand je le fais je reçois ceci:

Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails

Comment puis-je supprimer des clés étrangères liées à la table en laissant d'autres.

étudiant
la source

Réponses:

55

Premièrement, trouvez le FOREIGN KEYnom de votre contrainte de la manière suivante:

SELECT
  TABLE_NAME,
  COLUMN_NAME,
  CONSTRAINT_NAME,   -- <<-- the one you want! 
  REFERENCED_TABLE_NAME,
  REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'My_Table';

Et vous pouvez ensuite supprimer la contrainte nommée de la manière suivante:

ALTER TABLE My_Table DROP FOREIGN KEY My_Table_Constraint;

Références: 1 & 2 .

Comme suggéré par @SteffenWinkler dans les commentaires, s'il existe plusieurs tables de ce nom dans différents schémas / bases de données, vous pouvez ajouter un prédicat supplémentaire à votre clause where:

AND TABLE_SCHEMA = 'My_Database';
Vérace
la source
1
Merci pour le montage - je vous répondrai en répondant à votre question! :-)
Vérace
16
En outre, SHOW CREATE TABLE My_Table;.
Rick James
2
@RickJames que les contraintes que les émissions sur d' autres tables qui My_Tablen'a. La question demande des contraintes sur les My_Tableautres tables.
ADTC
2
Rien que pour les utilisateurs qui jettent un coup d'œil sur ceci: cette instruction répertorie toutes les contraintes référençant une table du nom spécifié sur l'ensemble du serveur de base de données. Limitez-le à la base de données en ajoutantAND TABLE_SCHEMA = 'My_Database';
Steffen Winkler
3

Edité la requête ci-dessus. Changement du nom de la table référencée en nom de table en tant que nom de table référencée. Il s'agit de la table référencée. Par conséquent, le résultat de la requête d'origine ne vous montrera pas les clés étrangères de votre table.

SELECT
  TABLE_NAME,
  COLUMN_NAME,
  CONSTRAINT_NAME,   -- <<-- the one you want! 
  REFERENCED_TABLE_NAME,
  REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  Table_name = 'case_qualitycontrolcase' and constraint_name = f
syed umar
la source