MySQL DROP alle Tabellen und ignoriert Fremdschlüssel

403

Gibt es eine gute einfache Möglichkeit, alle Tabellen aus einer MySQL-Datenbank zu löschen und dabei eventuell vorhandene Fremdschlüsseleinschränkungen zu ignorieren?

bcmcfc
quelle
1
Wenn Sie nicht viele andere Entitäten haben, warum nicht einfach DRAT DATABASE und von vorne anfangen?
StuartLC
161
So bewahren Sie Benutzerrechte.
bcmcfc
5
Ich habe gerade festgestellt, dass Sie in der Zwischenzeit eine Antwort von Dion Truter erhalten haben, die vollständiger ist als meine, und schlagen vor, diese stattdessen zu akzeptieren. (Der Teil " Alle Tabellen
löschen
5
Wenn Sie phpMyAdmin installiert haben, ist es einfach, alle Tabellen auszuwählen und zu löschen.
Benutzer
1
Das gilt aber nur für phpMyAdmin in Version 4.x. Wenn Sie alle Tabellen auswählen und Dropaus dem Dropdown-Menü auswählen , können Sie das Foreign key checkKontrollkästchen deaktivieren .
Jmarceli

Antworten:

474

Ich fand den generierten Satz von drop-Anweisungen nützlich und empfehle diese Optimierungen:

  1. Begrenzen Sie die generierten Drops wie folgt auf Ihre Datenbank:
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 es wird nur eine Liste von ihnen angezeigt. 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 DROP VIEW `VIEW_NAME`manuell korrigieren .

  1. Beachten Sie, dass das Löschen mit Kaskade gemäß http://dev.mysql.com/doc/refman/5.5/en/drop-table.html sinnlos / irreführend ist:

"RESTRICT und CASCADE dürfen die Portierung vereinfachen. In MySQL 5.5 tun sie nichts."

Damit die drop-Anweisungen bei Bedarf funktionieren:

SET FOREIGN_KEY_CHECKS = 0

Dadurch werden die referenziellen Integritätsprüfungen deaktiviert. Wenn Sie also die erforderlichen Löschvorgänge ausgeführt haben, möchten Sie die Schlüsselüberprüfung mit zurücksetzen

SET FOREIGN_KEY_CHECKS = 1
  1. Die endgültige Ausführung sollte folgendermaßen 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.

Dion Truter
quelle
6
@Timmm: Ich habe 3 Tropfen in meine Antwort geschrieben - dies führt sie jedoch auch nicht aus. Sie müssen sie aus Stackoverflow kopieren und in Ihre MySQL Workbench oder wo auch immer einfügen. Mit der obigen Auswahl erhalten Sie alle passenden Tropfen "kostenlos". Sie müssen sie nur kopieren und einfügen.
Chiccodoro
3
Ja, ich weiß, aber ich wollte es in einem Skript verwenden. Was ich letztendlich getan habe, ist DROP DATABASE foo; CREATE DATABASE foo;, dass es nicht ganz dasselbe ist, aber für mich funktioniert hat.
Timmmm
2
Nicht praktisch, wenn Hunderte von Tabellen vorhanden sind, aber besser als nichts, wenn die Neuerstellung einer Datenbank keine Option ist.
Nicolas Raoul
2
@Timmmm: Wenn Sie sich das noch einmal ansehen - Sie haben Recht, es beantwortet die Frage nicht vollständig. Die Antwort von Jean sieht vielversprechend aus - sie generiert die DROP-Anweisungen automatisch und führt sie aus, während die SET FOREIGN_KEY_CHECKS vorher und nachher ordnungsgemäß angewendet werden.
Chiccodoro
1
Verwenden Sie das Terminal, wenn Sie unter Linux oder Mac arbeiten, und es funktioniert, um sich bei Ihrem
MySQL-Kontotyp anzumelden
132

Von 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 hiermit die Deaktivierung von Fremdschlüsselprüfungen beantwortet wird, um die Tabellen in beliebiger Reihenfolge löschen zu können. Es wird nicht beantwortet, wie automatisch Drop-Table-Anweisungen für alle vorhandenen Tabellen generiert und in einem einzigen Skript ausgeführt werden. Jean's Antwort tut.)

Chiccodoro
quelle
10
Wenn Sie MySQL Workbench verwenden, können Sie vermeiden, dass Sie alle Tabellennamen eingeben müssen, indem Sie alle Tabellen in der linken Spalte auswählen, mit der rechten Maustaste klicken und dann die Option "Tabellen löschen" auswählen. Die IT generiert die SQL, die Sie kopieren und zwischen die Anweisungen SET FOREGIN_KEY_CHECKS einfügen können - wahrscheinlich auch in anderen GUIs.
Chris
danke hilfreich, und @chris super hilfreich, sollte eine Antwort hinzufügen
Andrew
97

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`;
Jean-François Beauchamp
quelle
2
Funktioniert mit Tabellen, kann Ansichten nicht löschen. Ich habe meine Eingabe immer noch massiv reduziert :) Danke.
Chrisinmtown
7 Jahre später würde ich sagen, Sie sollten _tableNamemit einem Backquotes abschließen. Andernfalls schlägt es bei einigen Tabellen wie groupoder anderen Schlüsselwörtern fehl .
Sashaaero
Pass auf dich auf! SELECT table_name FROM information_schema.TABLES WHERE table_schema = SCHEMA () AND table_type = "BASE TABLE";
Laurent Belloeil
42

Jeder der oben genannten Ansätze beinhaltet viel mehr Arbeit 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
SkyLeach
quelle
2
warum nicht nur Pfeife mysqldumpzu mysql, ohne den Umweg über eine Datei zu gehen?
Rolf
2
@Rolf kein besonderer Grund. Sich selbst umhauen.
SkyLeach
2
Danke, habe ich schon, die Klammer entfernt und verrohrt mysqldumpin grepin mysql, es funktioniert. Nochmals vielen Dank für Ihre Lösung, es ist gut.
Rolf
5
In diesem Fall fehlen die Fremdschlüsseleinschränkungen. Ich habe hier ein Bash-Skript hinzugefügt, das auf Ihrer Antwort basiert: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger
sooooooooooooo schlau!
zx1986
25

Aus dieser Antwort ergibt sich

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 aktuell verwendeten Datenbank gelöscht. Sie können die aktuelle Datenbank mit einstellen use.


Andernfalls ist die von Dion akzeptierte Antwort einfacher, außer dass Sie sie zweimal ausführen müssen, erstens, um die Abfrage zu erhalten, und zweitens, um die Abfrage auszuführen. Ich habe einige dumme Back-Ticks bereitgestellt, um Sonderzeichen in Datenbank- und Tabellennamen zu vermeiden.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
nawfal
quelle
Kurze und saubere Lösung. Viel besser als die Verfahrensalternative.
Rafael Renan Pacheco
16

Hier ist eine Cursor-basierte Lösung. Etwas langwierig, funktioniert aber als einzelner SQL-Stapel:

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;

    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;

END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;
SurlyDre
quelle
2
Schön, aber es werden leider keine Fremdschlüssel verarbeitet.
Timmmm
11

Du kannst tun:

select concat('drop table if exists ', table_name, ' cascade;')
  from information_schema.tables;

Führen Sie dann die generierten Abfragen aus. Sie löschen jede einzelne Tabelle in der aktuellen Datenbank.

Hier ist eine Hilfe auf drop tableBefehl.

Pablo Santa Cruz
quelle
Bei der obigen Antwort wird davon ausgegangen, dass ||dies der Verkettungsoperator ist. Insbesondere enthält der MySQL SQL-Modus PIPES_AS_CONCAT. Referenz: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan
@ Ionut: cool! Vielen Dank für den Hinweis. Das Codebeispiel, das concatanstelle von||
Pablo Santa Cruz,
9

Ich habe mir diese Änderung für die Antwort von Dion Truter ausgedacht, um es mit vielen Tabellen einfacher zu machen:

SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n', 
              GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
                           SEPARATOR ';\n'),
              ';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';

Dadurch wird das gesamte Objekt in einem Feld zurückgegeben, sodass Sie alle Tabellen einmal kopieren und löschen können ( Copy Field Content (unquoted)in Workbench verwenden). Wenn Sie viele Tabellen haben, können Sie einige Grenzen überschreiten GROUP_CONCAT(). Wenn ja, erhöhen Sie die maximale Variable (und max_allowed_packet, falls erforderlich).

Ryan P.
quelle
SET GROUP_CONCAT_MAX_LEN war der Trick, den ich brauchte. Ich hatte ein Skript, das funktionierte, aber immer beim ersten Mal mit einem abgeschnittenen Tabellennamen fehlschlug und dann beim zweiten Ausführen erfolgreich beendet wurde. Vielen Dank!
Dualmon
8

Das Googeln zum Thema bringt mich immer zu dieser SO-Frage. Hier ist also funktionierender MySQL-Code, der BEIDE Tabellen und Ansichten löscht:

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_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
        SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);

        PREPARE stmt1 FROM @stmt_sql1;
        PREPARE stmt2 FROM @stmt_sql2;

        EXECUTE stmt1;
        EXECUTE stmt2;

        DEALLOCATE PREPARE stmt1;
        DEALLOCATE PREPARE stmt2;
    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`;
Sergey Alaev
quelle
7

Ein Einzeiler zum Löschen aller Tabellen aus einer bestimmten Datenbank:

echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"

Wenn Sie dies ausführen, werden alle Tabellen aus der Datenbank DATABASE_NAME gelöscht.

Und das Schöne daran ist, dass der Datenbankname nur einmal explizit geschrieben wird.

mgershen
quelle
1
Dies funktionierte für mich, aber ich musste -i durch -I auf macOS High Sierra ersetzen
Ali Selcuk
1
Danke @AliSelcuk. Sowohl -i als auch -I funktionieren für mich unter Ubuntu, daher werde ich es in -I ändern, damit dies auch für macOS funktioniert.
mgershen
1
Sehr nützlich, danke! Ich musste ein Passwort mit -pPASSWORD (kein Leerzeichen zwischen -p und PASSWORD) an beide MySQL-Befehle übergeben
Mike
6

Hier ist eine automatisierte Möglichkeit, dies über ein Bash-Skript zu tun:

host=$1
dbName=$2
user=$3
password=$4

if [ -z "$1" ]
then
    host="localhost"
fi

# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
kfox
quelle
Mag diese Lösung wirklich, aber ich sehe nicht, wie die Hostvariable verwendet wird. Es scheint in keinem MySQL-Aufruf in der for-Schleife verwendet zu werden.
Matthew Zackschewski
1
Entschuldigung, ich habe es nicht in den Befehl eingefügt und es aktualisiert.
Kfox
5

Wenn Sie unter Linux (oder einem anderen System, das Piping, Echo und Grep unterstützt) arbeiten, können Sie dies mit einer Zeile tun:

echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;

Ich weiß, dass dies eine alte Frage ist, aber ich denke, diese Methode ist schnell und einfach.

moretti.fabio
quelle
2

In PHP ist es so einfach wie:

$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');

$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');

$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
          FROM information_schema.tables
          WHERE table_schema = 'YOURDB'";

foreach($pdo->query($query) as $row) {
    $pdo->exec($row[0]);
}

$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');

Denken Sie daran, YOURDB in den Namen Ihrer Datenbank und natürlich in den Benutzer / Pass zu ändern.

nsbucky
quelle
2

In einer Linux-Shell wie bash / zsh:

DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
  mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
  "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
   FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
  } | mysql "$DATABASE_TO_EMPTY"

Dadurch werden die Befehle generiert und sofort an eine zweite Client-Instanz weitergeleitet, die die Tabellen löscht.

Das clevere Stück wird natürlich von anderen Antworten hier kopiert - ich wollte nur einen kopierbaren und einfügbaren Einzeiler (ish), um tatsächlich die Arbeit zu erledigen, die das OP wollte.

Beachten Sie natürlich, dass Sie Ihre Anmeldeinformationen auch (zweimal) in diese MySQL-Befehle eingeben müssen, es sei denn, Sie haben ein sehr niedriges Sicherheits-Setup. (oder Sie könnten Ihren MySQL-Befehl aliasen, um Ihre Creds einzuschließen.)

Kunstroboter
quelle
2

Fügen Sie hier einfach einen nützlichen Kommentar von Jonathan Watt ein , um alle Tabellen zu löschen

MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL

Es hilft mir und ich hoffe, es könnte nützlich sein

Pavel.Solovyenko
quelle
2

Löschen Sie alle Tabellen aus der Datenbank mit einer einzigen Zeile aus der Befehlszeile:

mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]

Wobei [Benutzername], [Passwort], [Hostname] und [Datenbankname] durch echte Daten (Benutzer, Passwort, Hostname, Datenbankname) ersetzt werden müssen.

Peter Lozovitskiy
quelle
1

Dies ist ein ziemlich alter Beitrag, aber keine der Antworten hier hat die Frage meiner Meinung nach wirklich beantwortet. Ich hoffe, mein Beitrag wird den Menschen helfen!

Ich habe diese Lösung bei einer anderen Frage gefunden, die für mich sehr gut funktioniert:

mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done

Dadurch werden tatsächlich alle Ihre Tabellen in der Datenbank geleert DB_NAMEund nicht nur die angezeigtTRUNCATE Befehlszeile .

Hoffe das hilft!

mokk
quelle
Nützlich, aber es beantwortet die Frage nicht wirklich.
Jrosell
1

Aufbauend auf der Antwort von @Dion Truter und @Wade Williams löscht das folgende Shell-Skript alle Tabellen, nachdem es zuerst gezeigt hat, was ausgeführt werden soll, und gibt Ihnen die Möglichkeit, mit Strg-C abzubrechen.

#!/bin/bash

DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx

CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"

# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
    SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
    FROM information_schema.tables
    WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}

# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read

# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}
Philip Callender
quelle
0

Diese Lösung basiert auf der Antwort von @SkyLeach, unterstützt jedoch das Löschen von Tabellen mit Fremdschlüsseln.

echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql
pgmank
quelle
0
DB="your database name" \
    && mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
    && mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
    && mysql $DB < "SET FOREIGN_KEY_CHECKS=1"
Ernestas Stankevičius
quelle
0

Einfach und klar (kann sein).

Könnte keine ausgefallene Lösung sein, aber das 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. disable key constraint check
 4. copy the query generated from step 1
 5. enable key constraint check
 6. run show table

MySQL-Shell

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> 

Geben Sie hier die Bildbeschreibung ein

Sanjay
quelle
-1

Ich verwende Folgendes mit einem MSSQL-Server:

if (DB_NAME() = 'YOUR_DATABASE') 
begin
    while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
    begin
         declare @sql nvarchar(2000)
         SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
         FROM information_schema.table_constraints
         WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
         exec (@sql)
         PRINT @sql
    end

    while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
    begin
         declare @sql2 nvarchar(2000)
         SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
         FROM INFORMATION_SCHEMA.TABLES
        exec (@sql2)
        PRINT @sql2
    end
end
else
    print('Only run this script on the development server!!!!')

Ersetzen Sie YOUR_DATABASE durch den Namen Ihrer Datenbank oder entfernen Sie die gesamte IF-Anweisung (ich mag die zusätzliche Sicherheit).

Christiaan Maks
quelle
-7

Beste Lösung für mich bisher

Wählen Sie Datenbank -> Rechtsklick -> Aufgaben -> Skripte generieren - wird der Assistent zum Generieren von Skripten geöffnet. Klicken Sie nach Auswahl der Objekte in der festgelegten Skriptoption auf die Schaltfläche Erweitert . Wählen Sie unter "Script DROP and CREATE" die Option Script DROP .

Skript ausführen.

azza idz
quelle
Es hat fast funktioniert, aber ich habe auf den grünen Knopf vor dem blauen Knopf geklickt und links eine Box bekommen. Ich habe auf Abbrechen geklickt, aber dann habe ich meinen Kaffee getrunken und es vergessen.
Rolf
Können Sie uns überhaupt erklären, wo Sie geklickt haben? Gibt es dafür ein Werkzeug?
Nico Haase