MySQL DROP todas las tablas, ignorando claves foráneas

404

¿Hay una manera fácil y agradable de eliminar todas las tablas de una base de datos MySQL, ignorando las restricciones de clave externa que puedan estar allí?

bcmcfc
fuente
1
A menos que tenga muchas otras entidades, ¿por qué no simplemente DROP DATABASE y comenzar desde cero?
StuartLC
161
Para preservar los privilegios del usuario.
bcmcfc
55
Me acabo de dar cuenta de que, mientras tanto, Dion Truter recibió una respuesta que es más completa que la mía y sugirió aceptarla. (la parte de "soltar todas las mesas" no está cubierta por la mía)
chiccodoro
55
Para su información, si tiene phpMyAdmin instalado, es fácil seleccionar todas las tablas y soltarlas.
Usuario
1
Eso es cierto, pero solo para phpMyAdmin en la versión 4.x. Si selecciona todas las tablas y elige Dropdel menú desplegable, puede desmarcar la Foreign key checkcasilla de verificación.
jmarceli

Respuestas:

475

Encontré útil el conjunto generado de declaraciones de caída, y recomiendo estos ajustes:

  1. Limite las caídas generadas a su base de datos de esta manera:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Nota 1: Esto no ejecuta las declaraciones DROP, solo le da una lista de ellas. Necesitará cortar y pegar la salida en su motor SQL para ejecutarlos.

Nota 2: Si tiene VIEWs, deberá corregir cada DROP TABLE `VIEW_NAME`declaración DROP VIEW `VIEW_NAME`manualmente.

  1. Nota, según http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , dejar caer en cascada no tiene sentido / es engañoso:

"RESTRICT y CASCADE pueden hacer más fácil el portado. En MySQL 5.5, no hacen nada".

Por lo tanto, para que las declaraciones de caída funcionen si necesita:

SET FOREIGN_KEY_CHECKS = 0

Esto deshabilitará las verificaciones de integridad referencial, por lo que cuando termine de realizar las caídas que necesita, querrá restablecer la verificación de claves con

SET FOREIGN_KEY_CHECKS = 1
  1. La ejecución final debería verse así:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

NB: para usar la salida de SELECT más fácil, la opción mysql -B puede ayudar.

Dion Truter
fuente
66
@Timmm: he escrito 3 gotas en mi respuesta; sin embargo, esto tampoco las ejecuta. Debe copiarlos de Stackoverflow y pegarlos en su MySQL Workbench o en cualquier lugar. Con la selección anterior, obtienes todas las gotas coincidentes "gratis". Solo tienes que copiarlos y pegarlos.
chiccodoro
3
Sí, lo sé, pero quería usarlo en un guión. Lo que realmente terminé haciendo es DROP DATABASE foo; CREATE DATABASE foo;, que no es lo mismo, pero funcionó para mí.
Timmmm
2
No es conveniente cuando hay cientos de tablas, pero es mejor que nada si recrear la base de datos no es una opción.
Nicolas Raoul
2
@Timmmm: Mirando esto de nuevo, tienes razón, no responde completamente la pregunta. La respuesta de Jean parece prometedora: genera automáticamente las sentencias DROP y las ejecuta, mientras aplica correctamente el SET FOREIGN_KEY_CHECKS antes y después.
chiccodoro
1
use el terminal si está en Linux o Mac y funcionará para iniciar sesión en su cuenta de mysql tipo: mysql -u <nombre de usuario> -p luego presione enter ahora ingrese su contraseña seleccione la base de datos y luego escriba el código anterior para eliminar tablas
ismnoiet
132

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

(Tenga en cuenta que esto responde a cómo deshabilitar las comprobaciones de clave externa para poder descartar las tablas en un orden arbitrario. No responde cómo generar automáticamente declaraciones de caída de tabla para todas las tablas existentes y ejecutarlas en un solo script. Respuesta de Jean hace.)

chiccodoro
fuente
10
Si usa MySQL Workbench, puede evitar tener que escribir todos los nombres de tabla seleccionando todas las tablas en la columna izquierda, haciendo clic con el botón derecho y luego en la opción 'soltar tablas'. Generará el SQL que puede copiar y pegar entre las instrucciones SET FOREGIN_KEY_CHECKS, probablemente similar también en otras GUI.
Chris
gracias útil, y @chris super útil, debería agregar una respuesta
Andrew
97

Aquí se modifica el procedimiento almacenado de SurlyDre para que se ignoren las claves externas:

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
fuente
2
Funciona en tablas, no puede eliminar vistas. Todavía redujo mi mecanografía masivamente :) gracias.
chrisinmtown
7 años después, diría que deberías terminar _tableNamecon un backquotes. De lo contrario, fallará en algunas tablas como groupu otras palabras clave.
sashaaero
¡Cuida las vistas! SELECCIONE nombre_tabla DESDE información_esquema. TABLAS DONDE tabla_esquema = ESQUEMA () Y tipo_tabla = "TABLA BASE";
Laurent Belloeil
42

todos los enfoques anteriores incluyen mucho más trabajo 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
fuente
2
¿por qué no la tubería mysqldumpa mysql, sin tener que pasar a través de un archivo?
Rolf
2
@Rolf sin ninguna razón en particular. Noquearse.
SkyLeach
2
Gracias, ya lo hice, eliminan el paréntesis e hilo mysqldumpen grepen mysql, funciona. Gracias de nuevo por su solución, está bien.
Rolf
55
A este le faltan las restricciones de clave externa; He agregado un script bash aquí basado en su respuesta: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger
muuuuuuuuuuy inteligente!
zx1986
25

De esta respuesta ,

ejecutar:

  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;

Esto elimina las tablas de la base de datos actualmente en uso. Puede configurar la base de datos actual usando use.


O de lo contrario, la respuesta aceptada de Dion es más simple, excepto que debe ejecutarla dos veces, primero para obtener la consulta y, en segundo lugar, para ejecutar la consulta. Proporcioné algunas tonterías para escapar de caracteres especiales en db y nombres de tablas.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
nawfal
fuente
Solución corta y limpia. Mucho mejor que la alternativa de procedimiento.
Rafael Renan Pacheco
16

Aquí hay una solución basada en el cursor. Un poco largo pero funciona como un ú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
fuente
2
Agradable, pero desafortunadamente no maneja claves foráneas.
Timmmm
11

Tu puedes hacer:

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

Luego ejecute las consultas generadas. Eliminarán todas las tablas de la base de datos actual.

Aquí hay alguna ayuda sobre el drop tablecomando.

Pablo Santa Cruz
fuente
La respuesta anterior supone que ||está configurado para ser el operador de concatenación. Más específicamente, el modo MySQL SQL contiene PIPES_AS_CONCAT. Referencia: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan
@Ionut: genial! gracias por señalar eso. Se arregló el código de muestra para usar en concatlugar de||
Pablo Santa Cruz
9

Se me ocurrió esta modificación en la respuesta de Dion Truter para que sea más fácil con muchas tablas:

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

Esto devuelve todo en un campo, por lo que puede copiar una vez y eliminar todas las tablas (usar Copy Field Content (unquoted)en Workbench). Si tiene MUCHAS tablas, puede alcanzar algunos límites GROUP_CONCAT(). Si es así, aumente la variable max len (y max_allowed_packet, si es necesario).

Ryan P
fuente
SET GROUP_CONCAT_MAX_LEN fue el truco que necesitaba. Tenía un script que funcionaba, pero siempre fallaba la primera vez con algún nombre de tabla truncado, y luego terminaba con éxito cuando se ejecutaba por segunda vez. ¡Gracias!
dualmon
8

Una línea para eliminar todas las tablas de una base de datos determinada:

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

Al ejecutar esto, se eliminarán todas las tablas de la base de datos DATABASE_NAME.

Y lo bueno de esto es que el nombre de la base de datos solo se escribe explícitamente una vez.

Mgershen
fuente
1
esto funcionó para mí, pero tuve que reemplazar -i con -I en macOS High Sierra
Ali Selcuk
1
Gracias @AliSelcuk. Tanto -i como -I funcionan para mí en Ubuntu, así que lo cambiaré a -I para que esto también funcione para macOS.
mgershen
1
Muy útil, gracias! Tuve que pasar una contraseña usando -pPASSWORD (sin espacio entre -p y PASSWORD) a ambos comandos mysql
Mike
8

Buscar en Google sobre el tema siempre me lleva a esta pregunta SO, así que aquí está trabajando el código mysql que elimina AMBAS tablas y vistas:

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

Aquí hay una forma automatizada de hacer esto a través de un 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
fuente
Realmente me gusta esta solución, pero no veo cómo se usa la variable del lenguaje principal. Parece que no se usa en ninguna llamada mysql en el ciclo for.
Matthew Zackschewski
1
Lo sentimos, perdí ponerlo en el comando, lo actualicé.
kfox
5

Si está en Linux (o en cualquier otro sistema que admita tuberías, eco y grep), puede hacerlo con una línea:

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;

Sé que esta es una vieja pregunta, pero creo que este método es rápido y simple.

moretti.fabio
fuente
2

En php es tan fácil como:

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

Solo recuerde cambiar YOURDB al nombre de su base de datos, y obviamente al usuario / pase.

nsbucky
fuente
2

En un shell de Linux como 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"

Esto generará los comandos, luego los canalizará inmediatamente a una segunda instancia de cliente que eliminará las tablas.

La parte inteligente, por supuesto, se copia de otras respuestas aquí: solo quería una copia y pegar una línea (ish) para hacer realmente el trabajo que el OP quería.

Tenga en cuenta que, por supuesto, también tendrá que poner sus credenciales (dos veces) en estos comandos mysql, a menos que tenga una configuración de seguridad muy baja. (o puede alias su comando mysql para incluir su credibilidad).

artfulrobot
fuente
2

Simplemente ponga aquí algún comentario útil hecho por Jonathan Watt para descartar todas las tablas

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

Me ayuda y espero que pueda ser útil.

Pavel.Solovyenko
fuente
2

Descarte todas las tablas de la base de datos con una sola línea desde la línea de comandos:

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]

Donde [nombre de usuario], [contraseña], [nombre de host] y [nombre de base de datos] deben reemplazarse con datos reales (usuario, contraseña, nombre de host, nombre de base de datos).

Peter Lozovitskiy
fuente
1

Esta es una publicación bastante antigua, pero ninguna de las respuestas aquí realmente respondió la pregunta en mi opinión, ¡así que espero que mi publicación ayude a la gente!

Encontré esta solución en otra pregunta que me funciona muy bien:

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

Eso realmente vaciará todas sus tablas en la base de datos DB_NAME, y no solo mostrará la TRUNCATElínea de comando.

¡Espero que esto ayude!

mokk
fuente
Útil pero realmente no responde la pregunta.
jrosell
1

Sobre la base de la respuesta de @Dion Truter y @Wade Williams, el siguiente script de shell eliminará todas las tablas, después de mostrar primero lo que está a punto de ejecutar, y le dará la oportunidad de abortar el uso de 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
fuente
0

Esta solución se basa en la respuesta de @SkyLeach pero con el soporte de soltar tablas con claves foráneas.

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

Simple y claro (puede ser).

Puede que no sea una solución elegante, pero esto me funcionó y me salvó el día.

Trabajado para la versión del servidor: 5.6.38 MySQL Community Server (GPL)

Pasos que seguí:

 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> 

ingrese la descripción de la imagen aquí

Sanjay
fuente
-1

Yo uso lo siguiente con un 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!!!!')

Reemplace YOUR_DATABASE con el nombre de su base de datos o elimine toda la instrucción IF (me gusta la seguridad adicional).

Christiaan Maks
fuente
-7

La mejor solución para mí hasta ahora

Seleccione Base de datos -> Clic derecho -> Tareas -> Generar guiones - se abrirá el asistente para generar guiones. Después de elegir los objetos en la opción Establecer secuencias de comandos, haga clic en el botón Avanzado . En "Script DROP and CREATE" seleccione Script DROP .

Ejecutar guión.

azza idz
fuente
Casi funcionó, pero hice clic en el botón verde antes del botón azul y obtuve un cuadro a la izquierda e hice clic en cancelar, pero luego tomé mi café y me olvidé de eso.
Rolf
¿Podría incluso explicar dónde hizo clic? ¿Hay alguna herramienta involucrada para esto?
Nico Haase