MySQL DROP tutte le tabelle, ignorando le chiavi esterne


404

C'è un bel modo semplice per eliminare tutte le tabelle da un database MySQL, ignorando eventuali vincoli di chiave esterna che potrebbero esserci?


1
A meno che tu non abbia molte altre entità, perché non semplicemente DROP DATABASE e iniziare da zero?
StuartLC,

161
Per preservare i privilegi dell'utente.
bcmcfc,

5
Mi sono appena reso conto che nel frattempo hai ricevuto una risposta da Dion Truter più completa della mia e suggerisci invece di accettarla. (la parte "drop all tables" non è coperta dalla mia)
chiccodoro

5
se ti capita di avere installato phpMyAdmin è facile selezionare tutte le tabelle e rilasciarle.
Utente il

1
Questo è vero ma solo per phpMyAdmin nella versione 4.x. Se selezioni tutte le tabelle e scegli Dropdal menu a discesa, puoi deselezionare la Foreign key checkcasella di controllo.
jmarceli,

Risposte:


475

Ho trovato utile il set generato di istruzioni di rilascio e consiglio queste modifiche:

  1. Limitare i drop generati al database in questo modo:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Nota 1: Questo non esegue le istruzioni DROP, ma ti dà solo un elenco di esse. Dovrai tagliare e incollare l'output nel tuo motore SQL per eseguirli.

Nota 2: se hai VISUALIZZAZIONI, dovrai correggere manualmente ciascuna DROP TABLE `VIEW_NAME`istruzione DROP VIEW `VIEW_NAME`.

  1. Nota, per http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , cadere con la cascata è inutile / fuorviante:

"RESTRICT e CASCADE sono autorizzati a semplificare il porting. In MySQL 5.5, non fanno nulla."

Pertanto, affinché le istruzioni di rilascio funzionino se è necessario:

SET FOREIGN_KEY_CHECKS = 0

Questo disabiliterà i controlli di integrità referenziale - quindi quando hai finito di eseguire i drop di cui hai bisogno, vorrai ripristinare il controllo dei tasti con

SET FOREIGN_KEY_CHECKS = 1
  1. L'esecuzione finale dovrebbe apparire come:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

NB: per usare più facilmente l'output di SELECT, l'opzione mysql -B può essere d'aiuto.


6
@Timmm: ho scritto 3 gocce nella mia risposta - tuttavia, questo non le esegue neanche. Devi copiarli da StackOverflow e incollarli nel tuo MySQL Workbench o ovunque. Con la selezione sopra otterrai tutti i drop corrispondenti "gratis". Devi solo copiarli e incollarli.
Chiccodoro,

3
Sì, lo so, ma volevo usarlo in una sceneggiatura. Quello che alla fine ho fatto è DROP DATABASE foo; CREATE DATABASE foo;, che non è esattamente lo stesso, ma ha funzionato per me.
Timmmm,

2
Non conveniente quando ci sono centinaia di tabelle, ma meglio di niente se ricreare il database non è un'opzione.
Nicolas Raoul,

2
@Timmmm: guardando di nuovo questo, hai ragione, non risponde completamente alla domanda. La risposta di Jean sembra promettente: genera e genera automaticamente le istruzioni DROP e le esegue, applicando correttamente SET FOREIGN_KEY_CHECKS prima e dopo.
Chiccodoro,

1
usa il terminale se sei in linux o mac e funzionerà per accedere al tuo tipo di account mysql: mysql -u <username> -p quindi premi
invio

132

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

(Si noti che questo risponde a come disabilitare i controlli di chiave esterna per essere in grado di eliminare le tabelle in ordine arbitrario. Non risponde a come generare automaticamente le istruzioni delle tabelle di rilascio per tutte le tabelle esistenti ed eseguirle in un singolo script. Risposta di Jean lo fa.)


10
Se usi MySQL Workbench, puoi evitare di digitare tutti i nomi delle tabelle selezionando tutte le tabelle nella colonna di sinistra, facendo clic con il pulsante destro del mouse, quindi l'opzione "elimina tabelle". L'IT genererà l'SQL che è possibile copiare e incollare tra le istruzioni SET FOREGIN_KEY_CHECKS, probabilmente simili anche in altre GUI.
chris,

grazie utile e @chris super utile, dovrebbe aggiungere una risposta
Andrew

97

Ecco la procedura memorizzata di SurlyDre modificata in modo che le chiavi esterne vengano ignorate:

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

2
Funziona su tabelle, non riesce a eliminare le viste. Riducevo ancora in modo massiccio la mia digitazione :) grazie.
chrisinmtown,

7 anni dopo direi che dovresti concludere _tableNamecon un backquotes. Altrimenti fallirà su alcune tabelle come groupo altre parole chiave.
sashaaero,

Abbi cura dei panorami! SELEZIONA table_name FROM information_schema.TABLES DOVE table_schema = SCHEMA () AND table_type = "BASE TABLE";
Laurent Belloeil,

42

ogni approccio sopra include molto più lavoro di questo 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

2
perché non semplicemente mysqldumpeseguire il pipe mysql, senza passare attraverso un file?
Rolf,

2
@Rolf nessun motivo particolare. Buttati fuori.
SkyLeach

2
Grazie, ho già fatto, rimuovere la parentesi e convogliata mysqldumpin grepin mysql, funziona. Grazie ancora per la tua soluzione, va bene.
Rolf,

5
In questo mancano i vincoli di chiave esterna; Ho aggiunto uno script bash qui sulla base della tua risposta: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger

così intelligente!
zx1986,

25

Da questa risposta ,

eseguire:

  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;

Questo elimina le tabelle dal database attualmente in uso. È possibile impostare il database corrente utilizzando use.


O altrimenti, la risposta accettata da Dion è più semplice, tranne per il fatto che è necessario eseguirla due volte, prima per ottenere la query e in secondo luogo per eseguire la query. Ho fornito alcuni stupidi segni di spunta per sfuggire a caratteri speciali nei nomi di database e tabelle.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here

Soluzione corta e pulita. Molto meglio dell'alternativa alla procedura.
Rafael Renan Pacheco,

16

Ecco una soluzione basata sul cursore. Un po 'lungo ma funziona come un singolo batch 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`;

2
Bello, ma purtroppo non gestisce le chiavi esterne.
Timmmm,

11

Tu puoi fare:

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

Quindi eseguire le query generate. Rilasceranno ogni singola tabella nel database corrente.

Ecco qualche aiuto a drop tablecomando.


La risposta sopra presuppone che ||sia impostato come operatore di concatenazione. Più specificamente, contiene la modalità SQL MySQL PIPES_AS_CONCAT. Riferimento: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan

@Ionut: figo! Grazie per la segnalazione. Risolto il problema con l'esempio di codice da utilizzare concatinvece di||
Pablo Santa Cruz,

9

Ho escogitato questa modifica sulla risposta di Dion Truter per semplificare l'uso di molte tabelle:

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

Questo restituisce l'intera cosa in un campo, quindi puoi copiare una volta ed eliminare tutte le tabelle (usa Copy Field Content (unquoted) in Workbench). Se hai un sacco di tavoli, potresti avere dei limiti GROUP_CONCAT(). In tal caso, aumentare la variabile max len (e max_allowed_packet, se necessario).


SET GROUP_CONCAT_MAX_LEN era il trucco di cui avevo bisogno. Avevo una sceneggiatura che funzionava, ma la prima volta falliva sempre con un nome di tabella troncata e poi finiva con successo quando veniva eseguita una seconda volta. Grazie!
dualmon

8

Una riga per eliminare tutte le tabelle da un determinato database:

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

L'esecuzione di questo eliminerà tutte le tabelle dal database DATABASE_NAME.

E una cosa bella di questo è che il nome del database viene scritto esplicitamente una sola volta.


1
questo ha funzionato per me, ma ho dovuto sostituire -i con -I su macOS High Sierra
Ali Selcuk

1
Grazie @AliSelcuk. Sia -i che -I funzionano per me su Ubuntu, quindi lo cambierò in -I affinché funzioni anche per macOS.
mgershen

1
Molto utile, grazie! Ho dovuto passare una password usando -pPASSWORD (nessuno spazio tra -p e PASSWORD) per entrambi i comandi mysql
Mike

8

Googling sull'argomento mi porta sempre a questa domanda SO, quindi qui funziona il codice mysql che elimina ENTRAMBE tabelle e viste:

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

6

Ecco un modo automatizzato per farlo tramite uno script 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

Mi piace molto questa soluzione ma non vedo come viene utilizzata la variabile host. Non sembra essere usato in nessuna chiamata mysql nel ciclo for.
Matthew Zackschewski,

1
Siamo spiacenti, ho perso inserendolo nel comando, aggiornato.
kfox il

5

Se in linux (o qualsiasi altro sistema che supporta piping, echo e grep) puoi farlo con una riga:

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;

So che questa è una vecchia domanda, ma penso che questo metodo sia rapido e semplice.


2

In php è facile come:

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

Ricorda solo di cambiare YOURDB con il nome del tuo database e ovviamente l'utente / pass.


2

In una shell Linux come 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"

Ciò genererà i comandi, quindi li instraderà immediatamente a una seconda istanza client che eliminerà le tabelle.

La parte intelligente è ovviamente copiata da altre risposte qui - volevo solo un one-liner (ish) copia e incolla per fare effettivamente il lavoro che l'OP voleva.

Nota che dovrai inserire le tue credenziali (due volte) anche in questi comandi mysql, a meno che tu non abbia una configurazione di sicurezza molto bassa. (o potresti alias il tuo comando mysql per includere i tuoi crediti.)


2

Inserisci qui alcuni commenti utili fatti da Jonathan Watt per eliminare tutti i tavoli

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

Mi aiuta e spero che possa essere utile


2

Elimina tutte le tabelle dal database con una singola riga dalla riga di comando:

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]

Dove [user_name], [password], [host_name] e [database_name] devono essere sostituiti con dati reali (utente, password, nome host, nome database).


1

Questo è un post piuttosto vecchio, ma nessuna delle risposte qui ha veramente risposto alla domanda secondo me, quindi spero che il mio post possa aiutare le persone!

Ho trovato questa soluzione su un'altra domanda che funziona davvero bene per me:

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

Ciò effettivamente svuota tutte le tabelle nel database DB_NAMEe non visualizza solo la TRUNCATEriga di comando.

Spero che sia di aiuto!


Utile ma in realtà non risponde alla domanda.
jrosell,

1

Basandosi sulla risposta di @Dion Truter e @Wade Williams, il seguente script shell eliminerà tutte le tabelle, dopo aver prima mostrato ciò che sta per eseguire e dandoti la possibilità di interrompere utilizzando 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}

0

Questa soluzione si basa sulla risposta @SkyLeach ma con il supporto del rilascio di tabelle con chiavi esterne.

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

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"

0

Semplice e chiaro (può essere).

Potrebbe non essere una soluzione elegante, ma questo mi ha funzionato e mi ha salvato la giornata.

Ha funzionato per la versione Server: 5.6.38 MySQL Community Server (GPL)

I passaggi che ho seguito:

 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

Shell 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> 

inserisci qui la descrizione dell'immagine


-1

Uso quanto segue con un server 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!!!!')

Sostituisci YOUR_DATABASE con il nome del tuo database o rimuovi l'intera istruzione IF (Mi piace la sicurezza aggiunta).


-7

Soluzione migliore per me finora

Seleziona Database -> Clic destro -> Attività -> Genera script - aprirà la procedura guidata per la generazione di script. Dopo aver scelto gli oggetti nell'opzione di scripting impostata, fai clic sul pulsante Avanzate . In "Script DROP and CREATE" selezionare Script DROP .

Esegui script.


Ha quasi funzionato ma ho fatto clic sul pulsante verde prima del pulsante blu e ho ottenuto una casella a sinistra e ho fatto clic su Annulla ma poi ho bevuto il caffè e me ne sono dimenticato.
Rolf,

Potresti anche spiegare dove hai fatto clic? C'è qualche strumento coinvolto per questo?
Nico Haase,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.