Forcer la suppression de mysql en contournant la contrainte de clé étrangère


134

J'essaie de supprimer toutes les tables d'une base de données sauf une, et je finis par avoir 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 serai en mesure de réinsérer celles que je ne veut pas être supprimé).

Google m'a dirigé vers un site qui suggérait 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 je pouvais supprimer d'autres tables. 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 ne scénarise tout (ce qui est faisable dans le cas où il n'y a pas d'autre option)

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

Des idées?


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

Réponses:


-40

Puisque vous n'êtes pas intéressé par la conservation des données, supprimez toute la base de données et créez-en une nouvelle.


3
Oh mon Dieu, je me sens tellement stupide maintenant, je remplaçais le mot DATABASE par le nom réel de la base de données au lieu de l'ajouter par la suite, merci à tous les deux +1
johnnyArt

13
ce n'est pas la réponse
Freelancer

8
C'est hilarant de voir cette réponse cochée et des votes positifs
tom10271

4
@RobertPounder c'était exactement mon objectif, et ce depuis que j'ai rejoint ce site. J'apprécie votre point de vue.
Otávio Décio

3
@RobertPounder SO est un peu plus que simplement aider les OP, cela équivaut à une ressource de recherche «comment», j'ai atterri sur ce sujet parce que j'avais besoin de désactiver les vérifications de contrainte de clé étrangère, et Google m'a conduit ici. Je suis heureux de laisser tomber la base de données était une bonne solution de contournement pour l'OP, mais la réponse ci-dessous est en fait correcte pour la question «Forcer la suppression de mysql en contournant la contrainte de clé étrangère».
Val Redchenko

404

Cela pourrait être utile à quelqu'un qui se retrouve ici après une recherche. Assurez-vous que vous essayez de supprimer une table et non une vue .

SET Foreign_key_checks = 0;
- Drop tables
table de dépôt ...
- Drop vues
drop view ...
SET Foreign_key_checks = 1;

SET foreign_key_checks = 0consiste à désactiver les contrôles de clé étrangère, puis SET foreign_key_checks = 1à réactiver les contrôles de clé étrangère. Alors que les vérifications sont désactivées, les tables peuvent être supprimées, les vérifications sont ensuite réactivées pour conserver l'intégrité de la structure de la table.


43
PAT est mon ami!
SeanDowney

5
C'est une meilleure réponse correcte. Résout le problème de la suppression de toutes les tables ou de quelques-unes seulement. Terrifiant!
Luke Stevenson

@PAT Merci beaucoup, cela a fonctionné. bien que cela ne puisse pas fonctionner dans le navigateur Mysql Query. Tu as sauvé ma journée.
MaNn

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

1
Je conviens que c'est normalement la bonne solution, mais @johnnyArt, qui a posé la question, a spécifiquement exclu cela comme une option viable car cela ne fonctionnait pas pour lui. Il semble donc que ce ne soit pas la bonne réponse à la question initiale, n'est-ce pas?
David

18

Si vous utilisez phpmyadmin, cette fonctionnalité est déjà disponible.

  • Sélectionnez les tables que vous souhaitez supprimer
  • Dans la liste déroulante au bas de la liste des tableaux, sélectionnez déposer
  • Une nouvelle page sera ouverte avec la case à cocher en bas disant "Vérification de la clé étrangère", décochez-la.
  • Confirmez la suppression en acceptant "oui".

3
Tu as sauvé ma journée! Merci! A travaillé comme un charme!
Kami

4

Vous pouvez utiliser les étapes suivantes, cela a fonctionné pour moi de supprimer la table avec contrainte, solution déjà expliquée dans le commentaire ci-dessus, je viens d'ajouter une capture d'écran pour cela -entrez la description de l'image ici


Il s'agit d'un double de la réponse la plus votée, publiée quatre ans auparavant.
chb

3

La base de données de dépôt existe dans toutes les versions de MySQL. Mais si vous souhaitez conserver la structure du tableau, voici une idée

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

Ceci est un programme, pas une commande mysql

Ensuite, connectez-vous à mysql et

source dump.sql;


1

Solution simple pour supprimer toute la table à la fois du terminal.

Cela impliquait quelques étapes dans votre shell mysql (pas une solution en une étape cependant), cela m'a fonctionné et m'a sauvé la journée.

A travaillé pour la version Server: 5.6.38 MySQL Community Server (GPL)

É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> 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.