web-dev-qa-db-fra.com

Forcer la suppression de 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 j'obtiens le message d'erreur suivant:

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

Bien sûr, je pourrais essayer par erreur de 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 les réinsérer). ne veux pas être supprimé).

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 fonctionné puisque j’ai reçu la même erreur alors que j’étais capable de 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 le scripte 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, je ne peux donc pas utiliser DROP DATABASE

Des idées?

129
johnnyArt

Cela pourrait être utile à quelqu'un qui finit ici par une recherche. Assurez-vous que vous essayez de supprimer un table et pas un vue.

 SET foreign_key_checks = 0; 
 - Tables de suppression 
 Table de suppression ... 
 - Vues de suppression 
 Vue de suppression ... 
 SET foreign_key_checks = 1; 

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

367
PAT

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 au bas des tableaux, sélectionnez déposer
  • Une nouvelle page s'ouvrira avec une case à cocher en bas indiquant "Vérification de la clé étrangère", décochez-la.
  • Confirmez la suppression en acceptant "oui".
15
Ali Azhar

Vous pouvez utiliser les étapes suivantes, cela a fonctionné pour moi d’abandonner table avec contrainte, solution déjà expliquée dans le commentaire ci-dessus, je viens d’ajouter une capture d’écran pour cela -enter image description here

4
srinivas

La base de données de suppression existe dans toutes les versions de MySQL. Mais si vous voulez conserver la structure de la table, 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;

3
MindStalker

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.

Fonctionne pour la version 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

MySQL Shell

$ 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> 
0
Sanjay Khadka