Je reçois ce message d'erreur:
ERREUR 1217 (23000) à la ligne 40: impossible de supprimer ou de mettre à jour une ligne parente: une contrainte de clé étrangère échoue
... quand j'essaye 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à supprimé toutes les autres tables du schéma qui ont des clés étrangères area
. En fait, la base de données est vide à l'exception de la area
table.
Comment peut-il avoir des lignes enfants s'il n'y a pas d'autre objet dans la base de données? 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 une RENAME TABLE area TO something_else
commande: -?)
CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)
, à savoir, aucun nom de schéma sur la référence de table: -?Réponses:
Deux possibilités:
Vous pouvez voir de quelle table il s'agissait (l'un d'entre eux, en tout cas) en effectuant un "SHOW ENGINE INNODB STATUS" après l'échec de la suppression.
Si cela s'avère être le dernier cas, je viderais et restaurerais tout le serveur 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.
la source
SHOW ENGINE INNODB STATUS
rapports.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 instructions drop dans une requête, par exemple.
Où le
SET FOREIGN_KEY_CHECKS=1
sert de mesure de sécurité supplémentaire ...la source
SET FOREIGN_KEY_CHECKS=0;
au début du vidage.Désactiver la vérification des clés étrangères
la source
SET FOREIGN_KEY_CHECKS=0
et elle corrige le message d'erreur. Avez-vous une idée de la raison pour laquelle cela est nécessaire? Les clés étrangères sont-elles mises en cache même après la disparition des tables?SET FOREIGN_KEY_CHECKS=1;
vous après avoir terminé!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 ...de ce blog :
Vous pouvez désactiver temporairement les vérifications de clé étrangère:
Assurez-vous simplement de les restaurer une fois que vous avez fini de déconner:
la source
j'espère que son travail
SET Foreign_key_checks = 0; DROP TABLE
table name
; SET Foreign_key_checks = 1;la source
Sur les rails, on peut faire ce qui suit en utilisant
rails console
:la source
Vous avez peut-être déjà reçu une erreur lors de l'utilisation de cette table. Vous pouvez renommer la table et essayer de la supprimer à nouveau.
la source
J'ai trouvé une solution simple, exporter la base de données, la modifier ce que vous souhaitez modifier dans un éditeur de texte, puis l'importer. Terminé
la source
CREATE TABLE
code et charger à nouveau le vidage ... ne fera pas supprimer la table par MySQL. Et si vous voulez dire restaurer le vidage dans une nouvelle base de données ... Si vous voulez effacer toutes les tables comme moi, une base de données nouvellement créée sera déjà vide. Si vous souhaitez conserver certaines tables, laSET FOREIGN_KEY_CHECKS=0
solution de contournement mentionnée partout ici fonctionne correctement et est plus simple; et vous n'avez probablement pas besoin de modifier le vidage de toute façon puisque la nouvelle copie de vos données n'aura probablement pas de dictionnaire de données désynchronisé.Impossible de supprimer ou de mettre à jour une ligne parente: une contrainte de clé étrangère échoue (
table1
.user_role
, CONSTRAINTFK143BF46A8dsfsfds@#5A6BD60
FOREIGN KEY (user_id
) REFERENCESuser
(id
))Ce que j'ai fait en deux étapes simples. je supprime d'abord la ligne enfant dans la table enfant comme
mysql> supprimer de la table2 où role_id = 2 && user_id = 20;
Requête OK, 1 ligne affectée (0,10 s)
et la deuxième étape consiste à supprimer le parent
supprimer de table1 où id = 20;
Requête OK, 1 ligne affectée (0,12 s)
Par cela, je résous le problème, ce qui signifie supprimer l'enfant puis supprimer le parent
J'espère que vous l'avez. :)
la source