web-dev-qa-db-fra.com

La clé étrangère Bogus échoue

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'essaie de faire tomber 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;

La chose amusante est que j'ai déjà supprimé 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, à l'exception de la table area.

Comment peut-il éventuellement 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 commande RENAME TABLE area TO something_else: -?)

110
Álvaro González

Deux possibilités:

  1. Il y a 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 innodb n’est pas synchronisé avec celui de mysql.

Vous pouvez voir de quelle table il s'agissait (l'un d'entre eux, en tout cas) en effectuant un "AFFICHAGE DU STOCK INNODB MOTEUR" après l'échec de la suppression.

S'il s'avère que ce soit le dernier cas, je viderais et restaurerais le serveur entier si vous le pouviez.

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

101
MarkR

Sur demande, maintenant comme réponse ...

Lorsque vous utilisez le navigateur de requêtes MySQL ou phpMyAdmin, il apparaît qu'une nouvelle connexion est ouverte pour chaque requête ( bugs.mysql.com/bug.php?id=828 ), ce qui rend nécessaire l'écriture de toute la liste. déclarations dans une 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 ...

121
Karlis Rode

Désactiver la vérification de la clé étrangère

SET FOREIGN_KEY_CHECKS=0
47
Flakron Bytyqi

de ce blog :

Vous pouvez désactiver temporairement les vérifications de clé étrangère:

SET FOREIGN_KEY_CHECKS=0;

Assurez-vous simplement de les restaurer une fois que vous avez fini de vous amuser:

SET FOREIGN_KEY_CHECKS=1;
28
JackD

espérons que son travail

SET foreign_key_checks = 0; DROP TABLE table name; SET foreign_key_checks = 1;

6
M_ Fa

Sur Rails, on peut faire ce qui suit en utilisant le Rails console:

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
1
yeyo

j'ai trouvé une solution simple, exportez la base de données, éditez-la comme vous voulez éditer dans un éditeur de texte, puis importez-la. Terminé

0
Abdulrahman K

Peut-être avez-vous déjà reçu une erreur lorsque vous travaillez avec cette table. Vous pouvez renommer la table et essayer de la supprimer à nouveau.

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
0
Vadim Pluzhinsky