110 votes

Impossible de supprimer ou de mettre à jour une ligne parent : une contrainte de clé étrangère échoue.

Je reçois ce message d'erreur :

ERREUR 1217 (23000) à la ligne 40 : Impossible de supprimer ou mettre à jour une ligne parent : une contrainte de clé étrangère échoue

... lorsque j'essaie de déposer une table :

DROP TABLE IF EXISTS `area`;

... défini comme ceci :

CREATE TABLE `area` (
  `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
  `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
  `descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
  PRIMARY KEY (`area_id`),
  UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

Le plus drôle, c'est que J'ai déjà abandonné toutes les autres tables dans le schéma qui ont des clés étrangères contre area . En fait, la base de données est vide, sauf pour le area table.

Comment peut-il avoir des lignes enfant s'il n'y a pas d'autre objet dans la base de données ? Pour autant que je sache, InnoDB n'autorise pas les clés étrangères sur d'autres schémas, n'est-ce pas ?

(Je peux même exécuter un RENAME TABLE area TO something_else commande :- ?)

121voto

Karlis Rode Points 971

Sur demande, maintenant comme réponse...

Lorsque vous utilisez MySQL Query Browser ou phpMyAdmin, il semble qu'une nouvelle connexion soit ouverte pour chaque requête ( bugs.mysql.com/bug.php?id=8280 ), ce qui rend nécessaire d'écrire toutes les déclarations de dépôt dans une seule requête, par exemple.

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE my_first_table_to_drop; 
DROP TABLE my_second_table_to_drop; 
SET FOREIGN_KEY_CHECKS=1; 

Où le SET FOREIGN_KEY_CHECKS=1 sert de mesure de sécurité supplémentaire...

101voto

MarkR Points 37178

Deux possibilités :

  1. Il existe une table dans un autre schéma ("base de données" dans la terminologie mysql) qui a une référence FK.
  2. Le dictionnaire de données interne de innodb n'est pas synchronisé avec celui de mysql.

Vous pouvez voir de quelle table il s'agissait (l'une d'entre elles, en tout cas) en faisant un "SHOW ENGINE INNODB STATUS" après l'échec de la suppression.

Si c'est le dernier cas, je viderais et restaurerais le serveur entier si vous le pouvez.

MySQL 5.1 et supérieur vous donnera le nom de la table avec le FK dans le message d'erreur.

47voto

Flakron Bytyqi Points 2279

Désactiver la vérification des clés étrangères

DISABLE KEYS

28voto

JackD Points 31

De ce blog :

Vous pouvez désactiver temporairement les vérifications des clés étrangères :

SET FOREIGN_KEY_CHECKS=0;

Veillez simplement à les restaurer une fois que vous avez fini de vous amuser :

SET FOREIGN_KEY_CHECKS=1;

0voto

Vous avez peut-être reçu une erreur en travaillant avec ce tableau auparavant. Vous pouvez renommer le tableau et essayer de le supprimer à nouveau.

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;

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