Gibt es eine schöne einfache Möglichkeit, alle Tabellen aus einer MySQL-Datenbank zu löschen, ignorieren alle Fremdschlüssel-Beschränkungen, die in dort sein kann?
Antworten
Zu viele Anzeigen?Ich fand die generierten Drop Statements nützlich und empfehle diese Optimierungen:
-
Beschränken Sie die erzeugten Tropfen auf Ihre Datenbank wie folgt:
SELECT concat('DROP TABLE IF EXISTS
', table_name, '
;') FROM information_schema.tables WHERE table_schema = 'MyDatabaseName';
Hinweis 1: Dadurch werden die DROP-Anweisungen nicht ausgeführt, sondern nur aufgelistet. Sie müssen die Ausgabe ausschneiden und in Ihre SQL-Engine einfügen, um sie auszuführen.
Hinweis 2: Wenn Sie VIEWs haben, müssen Sie jede DROP TABLE `VIEW_NAME`
Anweisung an DROP VIEW `VIEW_NAME`
manuell.
- Hinweis, pro http://dev.mysql.com/doc/refman/5.5/en/drop-table.html Das Fallenlassen mit der Kaskade ist sinnlos/irreführend:
"RESTRICT und CASCADE sind erlaubt, um die Portierung zu erleichtern. In MySQL 5.5 bewirken sie nichts."
Damit die Drop Statements funktionieren, müssen Sie also
SET FOREIGN_KEY_CHECKS = 0
Dadurch werden die Prüfungen der referentiellen Integrität deaktiviert. Wenn Sie also die benötigten Tropfen durchgeführt haben, müssen Sie die Schlüsselprüfung mit
SET FOREIGN_KEY_CHECKS = 1
-
Die endgültige Ausführung sollte wie folgt aussehen:
SET FOREIGN_KEY_CHECKS = 0; -- Your semicolon separated list of DROP statements here SET FOREIGN_KEY_CHECKS = 1;
NB: Um die Ausgabe von SELECT einfacher zu verwenden, kann die Option mysql -B helfen.
En http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys :
SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;
(Beachten Sie, dass dies eine Antwort darauf ist, wie man Fremdschlüsselprüfungen deaktiviert, um die Tabellen in beliebiger Reihenfolge löschen zu können. Es beantwortet nicht, wie man automatisch Drop-Table-Anweisungen für alle existierenden Tabellen generiert und sie in einem einzigen Skript ausführt. Jean's Antwort tut.)
Hier ist die gespeicherte Prozedur von SurlyDre so geändert, dass Fremdschlüssel ignoriert werden:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
En diese Antwort ,
ausführen:
use `dbName`; --your db name here
SET FOREIGN_KEY_CHECKS = 0;
SET @tables = NULL;
SET GROUP_CONCAT_MAX_LEN=32768;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables, '') INTO @tables;
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Dadurch werden Tabellen aus der derzeit verwendeten Datenbank gelöscht. Sie können die aktuelle Datenbank mit use
.
Andernfalls ist die von Dion akzeptierte Antwort einfacher, außer dass man sie zweimal ausführen muss, zuerst, um die Abfrage zu erhalten, und dann, um die Abfrage auszuführen. Ich habe einige alberne Back-Ticks vorgesehen, um Sonderzeichen in DB- und Tabellennamen zu umgehen.
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
- See previous answers
- Weitere Antworten anzeigen
8 Stimmen
Wenn Sie nicht viele andere Entitäten haben, warum nicht einfach DROP DATABASE und von vorne anfangen?
221 Stimmen
Um die Benutzerrechte zu erhalten.
7 Stimmen
Ich habe gerade bemerkt, dass Sie in der Zwischenzeit eine Antwort von Dion Truter erhalten haben, die vollständiger ist als meine und schlage vor, diese stattdessen zu akzeptieren. (der "Tropfen todos Der Teil "Tabellen" wird von mir nicht abgedeckt)
6 Stimmen
Zu Ihrer Information: Wenn Sie phpMyAdmin installiert haben, können Sie ganz einfach alle Tabellen auswählen und löschen.
1 Stimmen
Das ist richtig, aber nur für phpMyAdmin in Version 4.x. Wenn Sie alle Tabellen auswählen und
Drop
im Dropdown-Menü können Sie die Markierung entfernenForeign key check
Kontrollkästchen.0 Stimmen
Siehe auch: Wie lösche ich alle MySQL-Tabellen über die Befehlszeile? .
0 Stimmen
@jmarceli Für PMA vor Version 4: Wählen Sie alle Tabellen in PMA aus und wählen Sie DROP. Daraufhin werden die DROP-Anweisungen aufgelistet. Kopieren Sie sie. Öffnen Sie die Registerkarte SQL-Ausführung von PMA. Fügen Sie zuerst ein
SET FOREIGN_KEY_CHECKS = 0
puis die von Ihnen kopierten Drop Statements und lastySET FOREIGN_KEY_CHECKS = 1
und laufen ;-)0 Stimmen
Benutzerprivilegien werden in MySQL nicht (mehr?) gelöscht, wenn eine DB gelöscht wird, daher ist es jetzt sicherlich einfacher und schneller, die DB einfach zu löschen, solange Sie CREATE/DROP DB-Rechte haben.