562 Stimmen

MySQL DROP alle Tabellen, ohne Berücksichtigung der Fremdschlüssel

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?

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)

709voto

Dion Truter Punkte 7012

Ich fand die generierten Drop Statements nützlich und empfehle diese Optimierungen:

  1. 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.

  1. 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
  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.

161voto

chiccodoro Punkte 14049

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.)

128voto

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`;

73voto

SkyLeach Punkte 1273

Jeder der oben genannten Ansätze ist mit viel mehr Arbeit verbunden als dieser, AFAICT...

( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql

41voto

nawfal Punkte 65966

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X