MySQL DROP wszystkie tabele, ignorując klucze obce

402

Czy istnieje dobry łatwy sposób na usunięcie wszystkich tabel z bazy danych MySQL, ignorując wszelkie ograniczenia dotyczące kluczy obcych, które mogą tam być?

bcmcfc
źródło
1
Jeśli nie masz wielu innych podmiotów, dlaczego nie po prostu DROP DATABASE i zacząć od nowa?
StuartLC,
161
Aby zachować uprawnienia użytkownika.
bcmcfc,
5
Właśnie zdałem sobie sprawę, że w międzyczasie otrzymałeś odpowiedź Diona Trutera, która jest bardziej kompletna niż moja, i sugeruję, abyś ją zaakceptował. (część „upuść wszystkie stoły” nie jest objęta moją)
chiccodoro
5
fyi, jeśli zdarzy ci się mieć zainstalowany phpMyAdmin, łatwo jest wybrać wszystkie tabele i upuścić je.
Użytkownik
1
To prawda, ale tylko dla phpMyAdmin w wersji 4.x. Jeśli wybierzesz wszystkie tabele i wybierzesz Dropz menu rozwijanego, możesz odznaczyć Foreign key checkpole wyboru.
jmarceli

Odpowiedzi:

473

Uważam, że wygenerowany zestaw instrukcji drop jest użyteczny i polecam następujące poprawki:

  1. Ogranicz generowane upuszczenia do bazy danych w następujący sposób:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Uwaga 1: To nie wykonuje instrukcji DROP, po prostu daje ci ich listę.Będziesz musiał wyciąć i wkleić dane wyjściowe do silnika SQL, aby je wykonać.

Uwaga 2: Jeśli masz WIDOKI, będziesz musiał je poprawić DROP TABLE `VIEW_NAME`DROP VIEW `VIEW_NAME` ręcznie instrukcję .

  1. Uwaga: według http://dev.mysql.com/doc/refman/5.5/en/drop-table.html upuszczanie kaskadą jest bezcelowe / mylące:

„RESTRICT i CASCADE mogą ułatwiać portowanie. W MySQL 5.5 nic nie robią”.

Dlatego, aby instrukcje drop działały, jeśli potrzebujesz:

SET FOREIGN_KEY_CHECKS = 0

Spowoduje to wyłączenie sprawdzania integralności referencyjnej - więc po zakończeniu upuszczania, którego potrzebujesz, będziesz musiał zresetować sprawdzanie klucza za pomocą

SET FOREIGN_KEY_CHECKS = 1
  1. Ostateczne wykonanie powinno wyglądać następująco:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

Uwaga: aby łatwiej użyć wyjścia SELECT, może pomóc opcja mysql -B.

Dion Truter
źródło
6
@Timmm: W odpowiedzi napisałem 3 krople, ale to też ich nie wykonuje. Musisz skopiować je z Stackoverflow i wkleić je do MySQL Workbench lub gdziekolwiek. Po wybraniu powyżej otrzymasz wszystkie pasujące krople „za darmo”. Musisz je tylko skopiować i wkleić.
chiccodoro,
3
Tak, wiem, ale chciałem użyć go w skrypcie. Skończyło się na tym DROP DATABASE foo; CREATE DATABASE foo;, że nie jestem taki sam, ale dla mnie zadziałał.
Timmmm,
2
Nie jest to wygodne, gdy istnieją setki tabel, ale lepiej niż nic, jeśli odtworzenie bazy danych nie jest możliwe.
Nicolas Raoul,
2
@Timmmm: Patrząc na to jeszcze raz - masz rację, to nie w pełni odpowiada na pytanie. Odpowiedź Jean wygląda obiecująco - zarówno automatycznie generuje instrukcje DROP, jak i wykonuje je, jednocześnie odpowiednio stosując SET FOREIGN_KEY_CHECKS przed i po.
chiccodoro
1
użyj terminala, jeśli jesteś w systemie Linux lub Mac, a będzie działać, aby zalogować się do typu konta mysql: mysql -u <nazwa użytkownika> -p, a następnie naciśnij Enter teraz wprowadź hasło wybierz bazę danych, a następnie napisz powyższy kod, aby usunąć tabele
ismnoiet
132

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

(Zauważ, że to wyjaśnia, jak wyłączyć sprawdzanie klucza obcego, aby móc upuścić tabele w dowolnej kolejności. Nie odpowiada, jak automatycznie generować instrukcje drop-table dla wszystkich istniejących tabel i wykonywać je w jednym skrypcie. Odpowiedź Jeana robi.)

Chiccodoro
źródło
10
Jeśli korzystasz z MySQL Workbench, możesz uniknąć konieczności wpisywania wszystkich nazw tabel, wybierając wszystkie tabele w lewej kolumnie, klikając prawym przyciskiem myszy, a następnie opcję „upuść tabele”. IT wygeneruje kod SQL, który można skopiować i wkleić między instrukcjami SET FOREGIN_KEY_CHECKS - prawdopodobnie podobnie w innych GUI.
Chris
dzięki pomocne i @chris bardzo pomocne, powinny dodać odpowiedź
Andrew
97

Oto zmodyfikowana procedura przechowywana SurlyDre, tak aby klucze obce były ignorowane:

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
źródło
2
Działa na tabelach, nie usuwa widoków. Nadal znacznie zmniejszyłem pisanie :) thx.
chrisinmtown
7 lat później powiedziałbym, że powinieneś zawrzeć _tableNamecytaty. W przeciwnym razie nie powiedzie się w przypadku niektórych tabel takich jak grouplub innych słów kluczowych.
sashaaero,
Zadbaj o widoki! WYBIERZ nazwę_tabeli Z schematu_informacyjnego.TABLES GDZIE schemat_tabeli = SCHEMA () AND typ_tabeli = "BASE TABLE";
laurent belloeil
42

każde powyższe podejście obejmuje znacznie więcej pracy niż ta 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
źródło
2
dlaczego nie tylko rury mysqldump, aby mysql, bez przechodzenia przez pliku?
Rolf
2
@Rolf bez konkretnego powodu. Ogłusz się.
SkyLeach
2
Dzięki, już to zrobiłem, usunąłem nawias i mysqldumpwprowadziłem grepdo mysqlniego, działa. Jeszcze raz dziękuję za twoje rozwiązanie, jest dobre.
Rolf
5
W tym brakuje ograniczeń klucza obcego; Dodałem tutaj skrypt bash na podstawie twojej odpowiedzi: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger
sooooooooooooo smart!
zx1986
25

Z tej odpowiedzi ,

wykonać:

  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;

Spowoduje to usunięcie tabel z aktualnie używanej bazy danych. Możesz ustawić bieżącą bazę danych za pomocą use.


W przeciwnym razie zaakceptowana odpowiedź Diona jest prostsza, z tym wyjątkiem, że musisz ją wykonać dwa razy, po pierwsze, aby uzyskać zapytanie, a po drugie, aby wykonać zapytanie. Podałem kilka głupich tyknięć, aby uciec od znaków specjalnych w nazwach db i tabel.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
nawfal
źródło
Krótkie i czyste rozwiązanie. O wiele lepszy niż procedura alternatywna.
Rafael Renan Pacheco
16

Oto rozwiązanie oparte na kursorze. Trochę długa, ale działa jako pojedyncza partia SQL:

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
źródło
2
Fajnie, ale niestety nie obsługuje kluczy obcych.
Timmmm,
11

Możesz to zrobić:

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

Następnie uruchom wygenerowane zapytania. Porzucą każdą tabelę w bieżącej bazie danych.

Oto pomoc dotycząca drop tablepoleceń.

Pablo Santa Cruz
źródło
Powyższa odpowiedź zakłada, że ||jest ustawiony jako operator konkatenacji. Mówiąc dokładniej, zawiera tryb MySQL SQL PIPES_AS_CONCAT. Odniesienie: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan
@Ionut: cool! dzięki za zwrócenie na to uwagi. Naprawiono przykładowy kod do użycia concatzamiast||
Pablo Santa Cruz
9

Wymyśliłem tę modyfikację w odpowiedzi Dion Truter, aby ułatwić wiele stolików:

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

Zwraca to całą rzecz w jednym polu, więc możesz skopiować raz i usunąć wszystkie tabele (użyj Copy Field Content (unquoted)w Workbench). Jeśli masz dużo stolików, możesz przekroczyć pewne limity GROUP_CONCAT(). Jeśli tak, zwiększ maksymalną wartość zmiennej len (i max_allowed_packet, jeśli to konieczne).

Ryan P.
źródło
SET GROUP_CONCAT_MAX_LEN był lewą, której potrzebowałem. Miałem skrypt, który działał, ale zawsze zawodził za pierwszym razem z jakąś skróconą nazwą tabeli, a następnie pomyślnie zakończył się przy drugim uruchomieniu. Dzięki!
dualmon
8

Googling na ten temat zawsze prowadzi mnie do tego SO pytania, więc tutaj działa kod mysql, który usuwa OBA tabele i widoki:

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`;
Siergiej Alaev
źródło
7

Jeden linijka do usunięcia wszystkich tabel z danej bazy danych:

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

Uruchomienie tego spowoduje usunięcie wszystkich tabel z bazy danych DATABASE_NAME.

Zaletą tego jest to, że nazwa bazy danych jest zapisywana jednoznacznie tylko raz.

mgershen
źródło
1
to zadziałało dla mnie, ale musiałem zamienić -i na -I na macOS High Sierra
Ali Selcuk
1
Dzięki @AliSelcuk. Zarówno -i, jak i -I działają dla mnie na Ubuntu, więc zmienię to na -I, aby działało to również w systemie macOS.
mgershen
1
Bardzo przydatne, dziękuję! Musiałem przekazać hasło przy użyciu opcji -pPASSWORD (bez spacji między -p a PASSWORD) do obu komend mysql
Mike
6

Oto zautomatyzowany sposób, aby to zrobić za pomocą skryptu bash:

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
źródło
Naprawdę podoba mi się to rozwiązanie, ale nie widzę, jak używana jest zmienna hosta. Wydaje się, że nie jest używany w żadnym wywołaniu mysql w pętli for.
Matthew Zackschewski
1
Przepraszamy, brakowało wpisania go w poleceniu, zaktualizowałem go.
kfox
5

Jeśli w systemie Linux (lub innym systemie obsługującym potokowanie, echo i grep) możesz to zrobić za pomocą jednej linii:

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;

Wiem, że to stare pytanie, ale myślę, że ta metoda jest szybka i prosta.

moretti.fabio
źródło
2

W php jest to tak proste jak:

$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');

Pamiętaj tylko, aby zmienić YOURDB na nazwę bazy danych i oczywiście na użytkownika / hasło.

nsbucky
źródło
2

W powłoce Linux, takiej jak 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"

Spowoduje to wygenerowanie poleceń, a następnie natychmiast potokuje je do drugiej instancji klienta, która usunie tabele.

Sprytny kawałek jest oczywiście kopiowany z innych odpowiedzi tutaj - chciałem tylko kopiować i wklejać jedno-liniowy (ish), aby faktycznie wykonać zadanie, które chciał OP.

Pamiętaj oczywiście, że w tych komendach mysql będziesz musiał (dwukrotnie) podać swoje dane uwierzytelniające, chyba że masz bardzo niskie ustawienia bezpieczeństwa. (lub możesz użyć aliasu polecenia mysql, aby dołączyć swoje poświadczenia.)

artfulrobot
źródło
2

Wystarczy umieścić tutaj użyteczny komentarz Jonathana Watta, aby usunąć wszystkie stoły

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

Pomaga mi i mam nadzieję, że może się przydać

Pavel.Solovyenko
źródło
2

Usuń wszystkie tabele z bazy danych za pomocą jednego wiersza z wiersza polecenia:

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]

Gdzie [nazwa_użytkownika], [hasło], [nazwa_hosta] i [nazwa_bazy_danych] muszą zostać zastąpione rzeczywistymi danymi (użytkownik, hasło, nazwa hosta, nazwa bazy danych).

Piotr Łozowicki
źródło
1

To dość stary post, ale moim zdaniem żadna z odpowiedzi tutaj nie odpowiada na pytanie, więc mam nadzieję, że mój post pomoże ludziom!

Znalazłem to rozwiązanie w innym pytaniu, które działa dla mnie naprawdę dobrze:

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

To faktycznie opróżni wszystkie tabele w bazie danych DB_NAME, a nie tylko wyświetliTRUNCATE wiersz poleceń.

Mam nadzieję że to pomoże!

mokk
źródło
Przydatne, ale tak naprawdę nie odpowiada na pytanie.
jrosell
1

Opierając się na odpowiedziach @Dion Truter i @Wade Williams, następujący skrypt powłoki usunie wszystkie tabele, po uprzednim pokazaniu, co ma zamiar uruchomić, i daje szansę przerwania za pomocą Ctrl-C.

#!/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
źródło
0

To rozwiązanie opiera się na odpowiedzi @SkyLeach, ale obsługuje usuwanie tabel z kluczami obcymi.

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
źródło
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
źródło
0

Proste i jasne (może być).

To może nie być wymyślne rozwiązanie, ale zadziałało to i uratowało mi dzień.

Pracował dla wersji serwera: 5.6.38 MySQL Community Server (GPL)

Kroki, które wykonałem:

 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

Powłoka MySQL

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> 

wprowadź opis zdjęcia tutaj

Sanjay
źródło
-1

Korzystam z następujących na serwerze MSSQL:

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!!!!')

Zamień YOUR_DATABASE na nazwę bazy danych lub usuń całą instrukcję IF (podoba mi się dodatkowe bezpieczeństwo).

Christiaan Maks
źródło
-7

Najlepsze rozwiązanieJak dotąd dla mnie

Wybierz Baza danych -> Kliknij prawym przyciskiem myszy -> Zadania -> Generuj skrypty - otworzy się kreator do generowania skryptów. Po wybraniu obiektów w zestawie opcji Skrypty kliknij przycisk Zaawansowane . W obszarze „Skrypt DROP i UTWÓRZ” wybierz Skrypt DROP .

Uruchom skrypt.

Azza idz
źródło
Prawie działało, ale kliknąłem zielony przycisk przed niebieskim przyciskiem i dostałem pudełko po lewej stronie i kliknąłem przycisk Anuluj, ale potem wypiłem kawę i zapomniałem o tym.
Rolf
Czy mógłbyś nawet wyjaśnić, gdzie kliknąłeś? Czy jest do tego jakieś narzędzie?
Nico Haase,