MySQL DROP toutes les tables, en ignorant les clés étrangères


404

Existe-t-il un moyen simple et facile de supprimer toutes les tables d'une base de données MySQL, en ignorant les contraintes de clé étrangère qui peuvent s'y trouver?


1
À moins que vous n'ayez beaucoup d'autres entités, pourquoi ne pas simplement DROP DATABASE et recommencer à zéro?
StuartLC

161
Pour préserver les privilèges des utilisateurs.
bcmcfc

5
Je viens de me rendre compte qu'en attendant, vous avez reçu une réponse de Dion Truter qui est plus complète que la mienne et je suggère de l'accepter à la place. (la partie "drop all tables" n'est pas couverte par la mienne)
chiccodoro

5
fyi si vous avez installé phpMyAdmin, il est facile de sélectionner toutes les tables et de les supprimer.
Utilisateur

1
C'est vrai, mais uniquement pour phpMyAdmin dans la version 4.x. Si vous sélectionnez toutes les tables et choisissez Dropdans le menu déroulant, vous pouvez décocher la Foreign key checkcase.
jmarceli

Réponses:


475

J'ai trouvé l'ensemble généré d'instructions drop utile et recommande ces modifications:

  1. Limitez les gouttes générées à votre base de données comme ceci:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Remarque 1: cela n'exécute pas les instructions DROP, il vous en donne juste une liste. Vous devrez couper et coller la sortie dans votre moteur SQL pour les exécuter.

Remarque 2: si vous avez des VUES, vous devrez corriger chaque DROP TABLE `VIEW_NAME`instruction DROP VIEW `VIEW_NAME`manuellement.

  1. Remarque, selon http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , la suppression avec cascade est inutile / trompeuse:

"RESTRICT et CASCADE sont autorisés à faciliter le portage. Dans MySQL 5.5, ils ne font rien."

Par conséquent, pour que les instructions drop fonctionnent si vous avez besoin:

SET FOREIGN_KEY_CHECKS = 0

Cela désactivera les vérifications d'intégrité référentielle - donc lorsque vous aurez terminé d'effectuer les suppressions dont vous avez besoin, vous voudrez réinitialiser la vérification des clés avec

SET FOREIGN_KEY_CHECKS = 1
  1. L'exécution finale devrait ressembler à:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

NB: pour utiliser plus facilement la sortie de SELECT, l'option mysql -B peut vous aider.


6
@Timmm: J'ai écrit 3 gouttes dans ma réponse - mais cela ne les exécute pas non plus. Vous devez les copier depuis Stackoverflow et les coller dans votre MySQL Workbench ou n'importe où. Avec la sélection ci-dessus, vous obtenez toutes les gouttes correspondantes "gratuitement". Il vous suffit de les copier-coller.
chiccodoro

3
Ouais je sais, mais je voulais l'utiliser dans un script. Ce que j'ai fini par faire DROP DATABASE foo; CREATE DATABASE foo;, c'est ce qui n'est pas tout à fait le même mais qui a fonctionné pour moi.
Timmmm

2
Pas pratique quand il y a des centaines de tables, mais mieux que rien si la recréation de la base de données n'est pas une option.
Nicolas Raoul

2
@Timmmm: En réexaminant cela - vous avez raison, cela ne répond pas entièrement à la question. La réponse de Jean semble prometteuse - elle génère à la fois automatiquement les instructions DROP et les exécute, tout en appliquant correctement les SET FOREIGN_KEY_CHECKS avant et après.
chiccodoro

1
utilisez le terminal si vous êtes sous linux ou mac et cela fonctionnera pour vous connecter à votre compte mysql type: mysql -u <nom d'utilisateur> -p puis appuyez sur Entrée maintenant entrez votre mot de passe sélectionnez la base de données puis écrivez le code ci-dessus pour supprimer les tables
ismnoiet

132

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

(Notez que cela explique comment désactiver les vérifications de clés étrangères afin de pouvoir supprimer les tables dans un ordre arbitraire. Il ne répond pas comment générer automatiquement des instructions drop-table pour toutes les tables existantes et les exécuter dans un seul script. Réponse de Jean Est-ce que.)


10
Si vous utilisez MySQL Workbench, vous pouvez éviter d'avoir à taper tous les noms de table en sélectionnant toutes les tables dans la colonne de gauche, en cliquant avec le bouton droit, puis l'option 'drop tables'. IL générera le SQL que vous pouvez copier et coller entre les instructions SET FOREGIN_KEY_CHECKS - probablement similaire dans d'autres GUI également.
chris

merci utile, et @chris super utile, devrait ajouter une réponse
Andrew

97

Voici la procédure stockée de SurlyDre modifiée afin que les clés étrangères soient ignoré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_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
Fonctionne sur les tables, ne parvient pas à supprimer les vues. Encore réduit ma frappe massivement :) thx.
chrisinmtown

7 ans plus tard, je dirais que vous devriez conclure _tableNameavec des citations. Sinon, il échouera sur certains tableaux comme groupou sur d'autres mots clés.
sashaaero

Prenez soin des vues! SELECT table_name FROM information_schema.TABLES WHERE table_schema = SCHEMA () AND table_type = "BASE TABLE";
laurent belloeil

42

chaque approche ci-dessus comprend beaucoup plus de travail que celle-ci 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
pourquoi ne pas simplement diriger mysqldumpvers mysql, sans passer par un fichier?
Rolf

2
@Rolf sans raison particulière. Assommez-vous.
SkyLeach

2
Merci, je l' ai déjà fait, enlevé la parenthèse et passepoilées mysqldumpen grepen mysql, cela fonctionne. Merci encore pour votre solution, c'est bien.
Rolf

5
Celui-ci manque les contraintes de clé étrangère; J'ai ajouté un script bash ici basé sur votre réponse: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger

sooooooooooooo intelligent!
zx1986

25

De cette réponse ,

exécuter:

  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;

Cela supprime les tables de la base de données actuellement utilisée. Vous pouvez définir la base de données actuelle à l'aide de use.


Ou sinon, la réponse acceptée par Dion est plus simple, sauf que vous devez l'exécuter deux fois, d'abord pour obtenir la requête, et ensuite pour exécuter la requête. J'ai fourni quelques back-ticks idiots pour échapper aux caractères spéciaux dans les noms de db et de table.

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

Solution courte et propre. Bien mieux que l'alternative de procédure.
Rafael Renan Pacheco

16

Voici une solution basée sur un curseur. Un peu long mais fonctionne comme un seul lot 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
Bien, mais il ne gère malheureusement pas les clés étrangères.
Timmmm

11

Tu peux faire:

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

Exécutez ensuite les requêtes générées. Ils supprimeront chaque table de la base de données actuelle.

Voici de l' aide sur drop tablecommande.


La réponse ci-dessus suppose qu'il ||est défini comme étant l'opérateur de concaténation. Plus spécifiquement, le mode SQL MySQL contient PIPES_AS_CONCAT. Référence: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan

@Ionut: cool! Merci d'avoir fait remarquer cela. Correction de l'exemple de code à utiliser à la concatplace de||
Pablo Santa Cruz

9

J'ai proposé cette modification sur la réponse de Dion Truter pour le rendre plus facile avec de nombreux tableaux:

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

Cela renvoie le tout dans un seul champ, vous pouvez donc copier une fois et supprimer toutes les tables (à utiliser Copy Field Content (unquoted)dans Workbench). Si vous avez BEAUCOUP de tables, vous pouvez atteindre certaines limites GROUP_CONCAT(). Si c'est le cas, augmentez la variable max len (et max_allowed_packet, si nécessaire).


SET GROUP_CONCAT_MAX_LEN était l'astuce dont j'avais besoin. J'avais un script qui fonctionnait, mais j'ai toujours échoué la première fois avec un nom de table tronqué, puis j'ai terminé avec succès lors de la deuxième exécution. Merci!
dualmon

8

Un liner pour supprimer toutes les tables d'une base de données donnée:

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

L'exécution de cette opération supprimera toutes les tables de la base de données DATABASE_NAME.

Et une bonne chose à ce sujet est que le nom de la base de données n'est écrit explicitement qu'une seule fois.


1
cela a fonctionné pour moi, mais j'ai dû remplacer -i par -I sur macOS High Sierra
Ali Selcuk

1
Merci @AliSelcuk. -I et -I fonctionnent pour moi sur Ubuntu, je vais donc le changer en -I pour que cela fonctionne également pour macOS.
mgershen

1
Très utile, merci! J'ai dû passer un mot de passe en utilisant -pPASSWORD (pas d'espace entre -p et PASSWORD) aux deux commandes mysql
Mike

8

La recherche sur le sujet m'amène toujours à cette question SO donc voici le code mysql qui supprime les DEUX tables et vues:

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

Voici une façon automatisée de le faire via 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

J'aime vraiment cette solution mais je ne vois pas comment la variable hôte est utilisée. Il ne semble pas être utilisé dans aucun appel mysql dans la boucle for.
Matthew Zackschewski

1
Désolé, vous ne l'avez pas mis dans la commande, je l'ai mis à jour.
kfox

5

Si sous Linux (ou tout autre système prenant en charge la tuyauterie, l'écho et grep), vous pouvez le faire avec une seule ligne:

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;

Je sais que c'est une vieille question, mais je pense que cette méthode est rapide et simple.


2

En php, c'est aussi simple que:

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

N'oubliez pas de changer YOURDB pour le nom de votre base de données, et bien sûr l'utilisateur / pass.


2

Dans un shell Linux comme 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"

Cela générera les commandes, puis les dirigera immédiatement vers une 2e instance client qui supprimera les tables.

Le morceau intelligent est bien sûr copié à partir d'autres réponses ici - je voulais juste une doublure (ish) copiable et collable pour faire réellement le travail que l'OP voulait.

Notez bien sûr que vous devrez également mettre vos informations d'identification (deux fois) dans ces commandes mysql, sauf si vous avez une configuration de sécurité très faible. (ou vous pouvez alias votre commande mysql pour inclure vos crédits.)


2

Mettez ici quelques commentaires utiles de Jonathan Watt pour supprimer toutes les tables

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

Cela m'aide et j'espère que cela pourrait être utile


2

Supprimez toutes les tables de la base de données avec une seule ligne depuis la ligne de commande:

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]

Où [nom_utilisateur], [mot de passe], [nom_hôte] et [nom_base_de_données] doivent être remplacés par des données réelles (utilisateur, mot de passe, nom d'hôte, nom de base de données).


1

Ceci est un assez vieux post, mais aucune des réponses ici n'a vraiment répondu à la question à mon avis, donc j'espère que mon post aidera les gens!

J'ai trouvé cette solution sur une autre question qui fonctionne très bien pour moi:

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

Cela va en fait vider toutes vos tables dans la base de données DB_NAME, et non seulement afficher la TRUNCATEligne de commande.

J'espère que cela t'aides!


Utile mais cela ne répond pas vraiment à la question.
jrosell

1

En s'appuyant sur la réponse de @Dion Truter et @Wade Williams, le script shell suivant supprimera toutes les tables, après avoir d'abord montré ce qu'il est sur le point d'exécuter, et vous donnant une chance d'interrompre en utilisant 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

Cette solution est basée sur la réponse @SkyLeach mais avec la prise en charge de la suppression de tables avec des clés étrangères.

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

Simple et clair (peut-être).

Ce n'est peut-être pas une solution sophistiquée, mais cela m'a fonctionné et m'a sauvé la journée.

Fonctionné pour la version serveur: 5.6.38 MySQL Community Server (GPL)

Étapes que j'ai suivies:

 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> 

entrez la description de l'image ici


-1

J'utilise ce qui suit avec un serveur 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!!!!')

Remplacez YOUR_DATABASE par le nom de votre base de données ou supprimez l'intégralité de l'instruction IF (j'aime la sécurité supplémentaire).


-7

Jusqu'à présent, la meilleure solution pour moi

Sélectionnez Base de données -> Clic droit -> Tâches -> Générer des scripts - ouvrira l'assistant de génération de scripts. Après avoir choisi les objets dans l'option de script définie, cliquez sur le bouton Avancé . Sous "Script DROP and CREATE", sélectionnez Script DROP .

Script de lancement.


Cela a presque fonctionné mais j'ai cliqué sur le bouton vert avant le bouton bleu et j'ai obtenu une boîte à gauche et j'ai cliqué sur Annuler mais j'ai bu mon café et j'ai oublié.
Rolf

Pourriez-vous même expliquer où vous avez cliqué? Y a-t-il un outil impliqué pour cela?
Nico Haase
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.