171 votes

Force drop mysql en contournant la contrainte de clé étrangère

J'essaie de supprimer toutes les tables d'une base de données sauf une, et je me retrouve avec l'erreur suivante :

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

Bien sûr, je pourrais faire des essais et des erreurs pour voir quelles sont ces contraintes clés et éventuellement supprimer toutes les tables, mais j'aimerais savoir s'il existe un moyen rapide de forcer la suppression de toutes les tables (car je pourrai réinsérer celles que je ne veux pas supprimer).

Google m'a dirigé vers un site qui proposait la méthode suivante :

mysql> SET foreign_key_checks = 0;
mysql> drop table ...
mysql> SET foreign_key_checks = 1;

La réponse courte est que cela n'a pas vraiment fait l'affaire puisque j'ai fini par recevoir la même erreur alors que j'ai pu supprimer quelques tables supplémentaires. J'ai vu sur Stack Overflow des moyens d'obtenir toutes les clés étrangères liées à une certaine table, mais cela prend beaucoup trop de temps, à moins que je script tout cela (ce qui est faisable dans le cas où il n'y a pas d'autre option).

La base de données est 4.1, je ne peux donc pas utiliser DROP DATABASE

Des idées ?

1 votes

Pourquoi avez-vous choisi la réponse sélectionnée qui ne fournit même pas la solution à votre question ?

483voto

PAT Points 1141

Cela pourrait être utile à quelqu'un qui arriverait ici après une recherche. Assurez-vous que vous essayez de déposer un tableau et non un voir .

SET foreign\_key\_checks = 0;
-- Drop tables
drop table ...
-- Drop views
drop view ...
SET foreign\_key\_checks = 1;

SET foreign_key_checks = 0 est de désactiver les vérifications des clés étrangères et ensuite SET foreign_key_checks = 1 est de réactiver les vérifications des clés étrangères. Pendant que les contrôles sont désactivés, les tables peuvent être abandonnées, puis les contrôles sont réactivés pour préserver l'intégrité de la structure de la table.

6 votes

C'est une meilleure réponse correcte. Elle résout le problème en supprimant toutes les tables ou seulement quelques-unes. Génial !

0 votes

@PAT Merci beaucoup, cela a fonctionné, mais pas dans le navigateur de requêtes Mysql. Vous avez sauvé ma journée.

0 votes

A parfaitement fonctionné, je l'ai utilisé car je ne peux pas supprimer toute la base de données.

22voto

Ali Azhar Points 1062

Si vous utilisez phpmyadmin alors cette fonctionnalité est déjà présente.

  • Sélectionnez les tables que vous souhaitez supprimer
  • Dans la liste déroulante située au bas de la liste des tableaux, sélectionnez "drop".
  • Une nouvelle page s'ouvrira avec une case à cocher en bas disant "Contrôle des clés étrangères", décochez-la.
  • Confirmez la suppression en acceptant "oui".

4voto

srinivas Points 38

Vous pouvez utiliser les étapes suivantes, cela a fonctionné pour moi pour supprimer une table avec une contrainte, la solution a déjà été expliquée dans le commentaire ci-dessus, j'ai juste ajouté une capture d'écran pour cela. enter image description here

1 votes

Il s'agit d'un doublon de la réponse la plus votée, qui a été publiée quatre ans auparavant.

3voto

MindStalker Points 7476

La base de données Drop existe dans toutes les versions de MySQL. Mais si vous souhaitez conserver la structure de la table, voici une idée

mysqldump --no-data --add-drop-database --add-drop-table -hHOSTNAME -uUSERNAME -p > dump.sql

C'est un programme, pas une commande mysql.

Ensuite, connectez-vous à mysql et

source dump.sql ;

3voto

Yegya Points 305

Solution simple pour déposer toutes les tables en une seule fois depuis le terminal.

Cela implique quelques étapes à l'intérieur de votre shell mysql (pas une solution en une seule étape cependant), cela a fonctionné et a sauvé ma journée.

Fonctionne pour la version du serveur : 5.6.38 MySQL Community Server (GPL)

Les étapes que j'ai suivies :

 1. generate drop query using concat and group_concat.
 2. use database
 3. turn off / disable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 0;), 
 4. copy the query generated from step 1
 5. re enable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 1;)
 6. run show table

Shell MySQL

$ mysql -u root -p
Enter password: ****** (your mysql root password)
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql>

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