Erzwingen Sie das Löschen von MySQL unter Umgehung der Fremdschlüsseleinschränkung

134

Ich versuche, alle Tabellen mit einer Ausnahme aus einer Datenbank zu löschen, und erhalte am Ende den folgenden Fehler:

Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl

Natürlich könnte ich versuchen, die wichtigsten Einschränkungen zu ermitteln und schließlich alle Tabellen zu löschen, aber ich würde gerne wissen, ob es eine schnelle Möglichkeit gibt, das Löschen aller Tabellen zu erzwingen (da ich diese Tabellen wieder einfügen kann nicht gelöscht werden wollen).

Google hat mich auf eine Website gerichtet, die die folgende Methode vorschlägt:

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

Die kurze Antwort ist, dass es nicht wirklich funktioniert hat, da ich den gleichen Fehler erhalten habe, während ich einige weitere Tabellen löschen konnte. Ich habe bei Stack Overflow Möglichkeiten gesehen, alle Fremdschlüssel mit einer bestimmten Tabelle zu verknüpfen, aber das ist viel zu zeitaufwändig, es sei denn, ich schreibe alles (was möglich ist, wenn es keine andere Option gibt).

Die Datenbank ist 4.1, daher kann ich sie nicht verwenden DROP DATABASE

Ideen?

johnnyArt
quelle
1
Warum haben Sie die Antwort als ausgewählt gewählt, die nicht einmal die Lösung für Ihre Frage bietet?
Sanjay

Antworten:

-40

Da Sie keine Daten behalten möchten, löschen Sie die gesamte Datenbank und erstellen Sie eine neue.

Otávio Décio
quelle
3
Oh mein
Gott
13
Dies ist nicht die Antwort
Freelancer
8
Es ist komisch zu sehen, dass diese Antwort angekreuzt und positiv bewertet wurde
tom10271
4
@RobertPounder das war genau mein Ziel und seit ich dieser Seite beigetreten bin. Ich schätze Ihren Standpunkt.
Otávio Décio
3
@RobertPounder SO ist ein bisschen mehr als nur die Unterstützung von OPs. Es handelt sich um eine durchsuchbare "How to" -Ressource. Ich bin auf dieses Thema gestoßen, weil ich die Überprüfung von Fremdschlüsseleinschränkungen deaktivieren musste, und Google hat mich hierher geführt. Ich bin froh, dass das Löschen der Datenbank eine gute Problemumgehung für das OP war, aber die folgende Antwort ist tatsächlich richtig für die Frage "Erzwinge das Löschen von MySQL unter Umgehung der Fremdschlüsseleinschränkung".
Val Redchenko
403

Dies kann für jemanden nützlich sein, der von einer Suche hierher kommt. Stellen Sie sicher, dass Sie versuchen, eine Tabelle und keine Ansicht zu löschen .

SET Foreign_key_checks = 0;
- Tabellen löschen
Drop Table ...
- Ansichten löschen
Drop View ...
SET Foreign_key_checks = 1;

SET foreign_key_checks = 0dient dazu, Fremdschlüsselprüfungen auszuschalten und dann SET foreign_key_checks = 1Fremdschlüsselprüfungen wieder einzuschalten. Während die Überprüfungen deaktiviert sind, können die Tabellen gelöscht werden. Die Überprüfungen werden dann wieder aktiviert, um die Integrität der Tabellenstruktur zu gewährleisten.

KLOPFEN
quelle
43
PAT ist mein Freund!
SeanDowney
5
Dies ist eine bessere richtige Antwort. Behebt das Problem, ob alle oder nur wenige Tabellen gelöscht werden. Umwerfend!
Luke Stevenson
@PAT Vielen Dank, es hat funktioniert. obwohl es im MySQL-Abfrage-Browser nicht funktionieren konnte. Du hast meinen Tag gerettet .
MaNn
hat perfekt funktioniert, ich habe dies verwendet, weil ich nicht die gesamte Datenbank
löschen
1
Ich stimme zu, dass dies normalerweise die richtige Lösung ist, aber @johnnyArt, der die Frage gestellt hat, hat dies ausdrücklich als praktikable Option ausgeschlossen, da es für ihn nicht funktioniert hat. Es scheint also, dass dies nicht die richtige Antwort auf die ursprüngliche Frage ist, oder?
David
18

Wenn Sie phpmyadmin verwenden, ist diese Funktion bereits vorhanden.

  • Wählen Sie die Tabellen aus, die Sie löschen möchten
  • Wählen Sie in der Dropdown-Liste am Ende der Tabellenliste die Option Drop aus
  • Eine neue Seite mit dem Kontrollkästchen "Fremdschlüsselprüfung" wird geöffnet. Deaktivieren Sie das Kontrollkästchen.
  • Bestätigen Sie den Löschvorgang mit "Ja".
Ali Azhar
quelle
3
Du hast meinen Tag gerettet ! Vielen Dank! Lief wie am Schnürchen!
Kami
4

Sie können die folgenden Schritte ausführen. Es hat für mich funktioniert, eine Tabelle mit Einschränkungen zu löschen. Die Lösung wurde bereits im obigen Kommentar erläutert. Ich habe gerade einen Screenshot dafür hinzugefügt.Geben Sie hier die Bildbeschreibung ein

Srinivas
quelle
Dies ist ein Duplikat der Antwort mit der höchsten Stimme, die vier Jahre zuvor veröffentlicht wurde.
chb
3

Drop-Datenbank gibt es in allen Versionen von MySQL. Wenn Sie jedoch die Tabellenstruktur beibehalten möchten, finden Sie hier eine Idee

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

Dies ist ein Programm, kein MySQL-Befehl

Dann melden Sie sich bei MySQL und

source dump.sql;

MindStalker
quelle
1

Einfache Lösung, um alle Tabellen auf einmal vom Terminal zu löschen.

Dies umfasste einige Schritte in Ihrer MySQL-Shell (allerdings keine Ein-Schritt-Lösung). Dies hat mir geholfen und meinen Tag gerettet.

Arbeitete für Server Version: 5.6.38 MySQL Community Server (GPL)

Schritte, denen ich gefolgt bin:

 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> 
Sanjay
quelle