MySQL DROP todas as tabelas, ignorando chaves estrangeiras

403

Existe uma maneira fácil e fácil de remover todas as tabelas de um banco de dados MySQL, ignorando quaisquer restrições de chave estrangeira que possam estar lá?

bcmcfc
fonte
11
A menos que você tenha muitas outras entidades, por que não apenas DROP DATABASE e começar do zero?
StuartLC
161
Para preservar privilégios de usuário.
precisa saber é o seguinte
5
Acabei de perceber que, enquanto isso, você recebe uma resposta de Dion Truter que é mais completa que a minha e sugere que aceite. (a "cair todas as tabelas" parte não é coberto pelo meu)
chiccodoro
5
Se você tiver o phpMyAdmin instalado, é fácil selecionar todas as tabelas e descartá-las.
Utilizador
11
Isso é verdade, mas apenas para o phpMyAdmin na versão 4.x. Se você selecionar todas as tabelas e escolher Dropno menu suspenso, poderá desmarcar a Foreign key checkcaixa de seleção.
jmarceli

Respostas:

474

Achei o conjunto de instruções drop gerado útil e recomendo estes ajustes:

  1. Limite as gotas geradas no seu banco de dados da seguinte maneira:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Nota 1: Isso não executa as instruções DROP, apenas fornece uma lista delas. Você precisará recortar e colar a saída no seu mecanismo SQL para executá-las.

Nota 2: Se você tiver VIEWs, precisará corrigir cada DROP TABLE `VIEW_NAME`declaração DROP VIEW `VIEW_NAME`manualmente.

  1. Observe que, por http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , descartar com cascata é inútil / enganoso:

"RESTRICT e CASCADE têm permissão para facilitar a portabilidade. No MySQL 5.5, eles não fazem nada."

Portanto, para que as instruções drop funcionem, se você precisar:

SET FOREIGN_KEY_CHECKS = 0

Isso desabilitará as verificações de integridade referencial - portanto, quando terminar de executar as descargas necessárias, você deverá redefinir a verificação de chave com

SET FOREIGN_KEY_CHECKS = 1
  1. A execução final deve se parecer com:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

Nota: para usar a saída de SELECT mais fácil, a opção mysql -B pode ajudar.

Dion Truter
fonte
6
@ Timmm: Eu escrevi 3 gotas na minha resposta - no entanto, isso também não as executa. Você precisa copiá-los do Stackoverflow e colá-los no MySQL Workbench ou em qualquer outro lugar. Com a seleção acima, você obtém todas as gotas correspondentes "de graça". Você apenas precisa copiá-los e colá-los.
chiccodoro
3
Sim, eu sei, mas eu queria usá-lo em um script. O que acabei fazendo é o DROP DATABASE foo; CREATE DATABASE foo;que não é exatamente o mesmo, mas funcionou para mim.
Timmmm
2
Não é conveniente quando existem centenas de tabelas, mas é melhor que nada se recriar o banco de dados não for uma opção.
Nicolas Raoul
2
@ Timmmm: Olhando para isso de novo - você está certo, ele não responde totalmente à pergunta. A resposta de Jean parece promissora - ele gera automaticamente as instruções DROP e as executa, enquanto aplica corretamente o SET FOREIGN_KEY_CHECKS antes e depois.
chiccodoro
11
use o terminal se você estiver no linux ou no mac e ele funcionará para fazer login na sua conta do mysql: mysql -u <nome do usuário> -p, em seguida, pressione enter agora digite sua senha, selecione o banco de dados e escreva o código acima para excluir as tabelas
ismnoiet
132

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

(Note que este respostas como verificação de chaves estrangeiras com deficiência, a fim de ser capaz de eliminar as tabelas em ordem arbitrária. Ele não responde como gerar automaticamente declarações drop-mesa para todas as tabelas existentes e executá-los em um único script. A resposta de Jean faz.)

chiccodoro
fonte
10
Se você usa o MySQL Workbench, pode evitar a digitação de todos os nomes de tabelas selecionando todas as tabelas na coluna da esquerda, clicando com o botão direito do mouse e, em seguida, a opção 'soltar tabelas'. A TI gerará o SQL que você pode copiar e colar entre as instruções SET FOREGIN_KEY_CHECKS - provavelmente semelhantes em outras GUIs também.
Chris27 /
graças útil, e @ Chris super útil, deve adicionar uma resposta
Andrew
97

Aqui está o procedimento armazenado do SurlyDre modificado para que chaves estrangeiras sejam ignoradas:

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
fonte
2
Funciona em tabelas, falha ao excluir visualizações. Ainda reduzi bastante minha digitação :) thx.
Chrisinmtown
Sete anos depois, eu diria que você deve encerrar _tableNamecom aspas. Caso contrário, ele falhará em algumas tabelas, como groupoutras palavras-chave.
Sashaaero 25/12/19
Cuide das vistas! SELECT table_name FROM information_schema.TABLES WHERE table_schema = SCHEMA () AND table_type = "BASE TABLE";
laurent belloeil
42

todas as abordagens acima incluem muito mais trabalho do que este 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
fonte
2
porque não basta tubulação mysqldumppara mysql, sem passar por um arquivo?
Rolf
2
@Rolf nenhuma razão em particular. Derrube-se.
SkyLeach
2
Obrigado, eu já fiz, removido o parêntese e canalizado mysqldumppara grepdentro mysql, ele funciona. Mais uma vez obrigado pela sua solução, é bom.
Rolf
5
Este está faltando as restrições de chave estrangeira; Eu adicionei um script aqui com base em sua resposta: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger
sooooooooooooo inteligente!
zx1986
25

A partir desta resposta ,

executar:

  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;

Isso remove tabelas do banco de dados atualmente em uso. Você pode definir o banco de dados atual usando use.


Ou, caso contrário, a resposta aceita por Dion é mais simples, exceto que você precisa executá-la duas vezes, primeiro para obter a consulta e depois para executá-la. Forneci alguns back-ticks tolos para escapar de caracteres especiais nos nomes de banco de dados e tabela.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
nawfal
fonte
Solução curta e limpa. Muito melhor que a alternativa de procedimento.
Rafael Renan Pacheco
16

Aqui está uma solução baseada em cursor. Meio demorado, mas funciona como um único lote 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
fonte
2
Bom, mas não lida com chaves estrangeiras, infelizmente.
Timmmm
11

Você pode fazer:

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

Em seguida, execute as consultas geradas. Eles soltarão todas as tabelas no banco de dados atual.

Aqui está alguma ajuda no drop tablecomando.

Pablo Santa Cruz
fonte
A resposta acima assume que ||está definido como o operador de concatenação. Mais especificamente, o modo SQL do MySQL contém PIPES_AS_CONCAT. Referência: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan
@Ionut: legal! Obrigado por apontar isso. Corrigido o exemplo de código para usar concatem vez de||
Pablo Santa Cruz
9

Eu vim com essa modificação na resposta de Dion Truter para facilitar com muitas tabelas:

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

Isso retorna a coisa inteira em um campo, para que você possa copiar uma vez e excluir todas as tabelas (use Copy Field Content (unquoted)no Workbench). Se você tiver muitas mesas, poderá atingir alguns limites GROUP_CONCAT(). Nesse caso, aumente a variável max len (e max_allowed_packet, se necessário).

Ryan P
fonte
SET GROUP_CONCAT_MAX_LEN foi o truque que eu precisava. Eu tinha um script que estava funcionando, mas sempre falhava na primeira vez com algum nome de tabela truncado e, em seguida, finalizei com êxito quando executado pela segunda vez. Obrigado!
dualmon
8

Um liner para eliminar todas as tabelas de um determinado banco de dados:

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

A execução disso eliminará todas as tabelas do banco de dados DATABASE_NAME.

E uma coisa boa sobre isso é que o nome do banco de dados é escrito apenas explicitamente uma vez.

mgershen
fonte
11
Isso funcionou para mim, mas eu tive que substituir -i com -I no MacOS High Sierra
Ali Selcuk
11
Obrigado @AliSelcuk. -I e -I funcionam para mim no Ubuntu, então vou alterá-lo para -I para que funcione também no macOS.
mgershen
11
Muito útil, obrigado! Eu tinha que passar uma senha usando Ppassword (sem espaço entre -p e senha) para ambos os comandos mysql
Mike
8

A pesquisa no tópico sempre me leva a essa pergunta SO, então aqui está o código mysql que exclui AMBAS tabelas e visualizações:

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
fonte
6

Aqui está uma maneira automatizada de fazer isso por meio de um 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
kfox
fonte
Realmente gosto dessa solução, mas não vejo como a variável host é usada. Não parece ser usado em nenhuma chamada mysql no loop for.
Matthew Zackschewski 27/01
11
Desculpe, esqueci de colocá-lo no comando, atualizei-o.
kfox 03/02
5

Se no linux (ou em qualquer outro sistema que suporte tubulação, eco e grep), você pode fazer isso com uma linha:

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;

Sei que essa é uma pergunta antiga, mas acho que esse método é rápido e simples.

moretti.fabio
fonte
2

No php é tão fácil quanto:

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

Lembre-se de alterar o YOURDB para o nome do seu banco de dados e, obviamente, o usuário / passe.

nsbucky
fonte
2

Em um shell Linux como o 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"

Isso irá gerar os comandos e, em seguida, direcioná-los imediatamente para uma segunda instância do cliente que excluirá as tabelas.

Obviamente, a parte mais inteligente é copiada de outras respostas aqui - eu só queria uma linha única copiável e colável (ish) para realmente fazer o trabalho que o OP queria.

Note que é claro que você terá que colocar suas credenciais (duas vezes) nesses comandos mysql também, a menos que você tenha uma configuração de segurança muito baixa. (ou você pode usar o comando mysql para incluir seus creds.)

artfulrobot
fonte
2

Basta colocar aqui alguns comentários úteis feitos por Jonathan Watt para descartar todas as tabelas

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

Isso me ajuda e espero que seja útil

Pavel.Solovyenko
fonte
2

Solte todas as tabelas do banco de dados com uma única linha da linha de 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]

Onde [user_name], [password], [host_name] e [database_name] devem ser substituídos por dados reais (usuário, senha, nome do host, nome do banco de dados).

Peter Lozovitskiy
fonte
1

Este é um post bastante antigo, mas nenhuma das respostas aqui realmente respondeu à pergunta na minha opinião, por isso espero que meu post ajude as pessoas!

Encontrei esta solução em outra pergunta que funciona muito bem para mim:

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

Isso realmente esvaziará todas as suas tabelas no banco de dados DB_NAMEe não apenas exibirá a TRUNCATElinha de comando.

Espero que isto ajude!

mokk
fonte
Útil, mas realmente não responde à pergunta.
jrosell
1

Com base na resposta de @Dion Truter e @Wade Williams, o seguinte script de shell descartará todas as tabelas, depois de mostrar primeiro o que está prestes a ser executado e dar a você a chance de abortar usando 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
fonte
0

Esta solução é baseada na resposta do @SkyLeach, mas com o suporte de eliminar tabelas com chaves estrangeiras.

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
fonte
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
fonte
0

Simples e claro (pode ser).

Pode não ser uma solução sofisticada, mas isso me funcionou e salvou meu dia.

Trabalhou para a versão Server: 5.6.38 MySQL Community Server (GPL)

Etapas que segui:

 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> 

insira a descrição da imagem aqui

Sanjay
fonte
-1

Eu uso o seguinte com um servidor 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!!!!')

Substitua YOUR_DATABASE pelo nome do seu banco de dados ou remova toda a instrução IF (eu gosto da segurança adicional).

Christiaan Maks
fonte
-7

Melhor solução para mim até agora

Selecione Banco de Dados -> Clique com o Botão Direito -> Tarefas -> Gerar Scripts - abrirá o assistente para gerar scripts. Depois de escolher os objetos na opção Definir script, clique no botão Avançado . Em "Script DROP and CREATE", selecione Script DROP .

Execute o script.

azza idz
fonte
Quase funcionou, mas cliquei no botão verde antes do botão azul, peguei uma caixa à esquerda e cliquei em cancelar, mas depois tomei meu café e esqueci.
Rolf
Você poderia explicar onde clicou? Existe alguma ferramenta envolvida para isso?
Nico Haase #