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

y a-t-il un moyen facile de faire tomber toutes les tables d'une base de données MySQL, en ignorant toutes les contraintes de clé étrangère qui peuvent y être?

296
demandé sur kenorb 2010-08-13 16:28:38

21 réponses

j'ai trouvé l'ensemble généré des déclarations de chute 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';

Note: Ceci n'exécute pas les DROP statements, il vous donne juste une liste d'entre eux. vous aurez besoin de couper et coller la sortie dans votre moteur SQL pour les exécuter.

  1. Note, par http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , tomber avec cascade est inutile/ trompeur:

"RESTREINDRE et CASCADE sont autorisés à effectuer le portage plus facile. Dans MySQL 5.5, ils ne font rien."

par conséquent, pour que les instructions de largage fonctionnent si vous avez besoin:

SET FOREIGN_KEY_CHECKS = 0

ceci désactivera les contrôles d'intégrité référentiels-so lorsque vous avez terminé d'effectuer les gouttes dont vous avez besoin, vous pouvez réinitialiser la clé de vérification 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 la sortie de SELECT easier, l'option mysql-B peut aider.

338
répondu Dion Truter 2018-04-26 16:56:53

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;

(notez que ceci répond à la façon de désactiver les vérifications de clés étrangères afin de pouvoir laisser tomber les tables dans l'ordre arbitraire. Il ne répond pas à la question de savoir comment générer automatiquement des instructions drop-table pour toutes les tables existantes et les exécuter dans un seul script. la réponse de Jean does.)

120
répondu chiccodoro 2014-08-18 06:19:05

Voici la procédure stockée de SurlyDre modifiée pour 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`;
78
répondu Jean-François Beauchamp 2013-03-22 08:22:51

à Partir 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;

ceci supprime les tableaux de la base de données actuellement utilisée. Vous pouvez définir la base de données actuelle en utilisant use .


ou autrement, 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 des coups de pied dans le dos pour échapper au Spécial les caractères en db et les noms de table.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
17
répondu nawfal 2017-05-23 12:26:36

chaque approche ci-dessus inclut beaucoup plus de travail que celui-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
16
répondu SkyLeach 2016-01-15 19:59:47

Voici une solution basée sur le curseur. Un peu long, mais fonctionne comme un lot unique 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`;
14
répondu SurlyDre 2012-04-15 07:00:24

Vous pouvez le faire:

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

lancez ensuite les requêtes générées. Ils laisseront tomber chaque table sur la base de données actuelle.

ici est de l'aide sur drop table commande.

9
répondu Pablo Santa Cruz 2010-08-13 12:40:13

j'ai apporté cette modification à la réponse de Dion Truter pour la 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';

renvoie l'ensemble dans un seul champ, vous pouvez donc copier une seule fois et supprimer toutes les tables (utilisez Copy Field Content (unquoted) dans L'établi). Si vous avez beaucoup de tables, vous pouvez frapper quelques limites sur GROUP_CONCAT() . Dans l'affirmative, augmenter la variable max len (et max_allowed_packet , si nécessaire).

8
répondu Ryan P 2013-07-24 01:18:34

Voici une façon automatisée de le faire via un script bash:

host=
dbName=
user=
password=

if [ -z "" ]
then
    host="localhost"
fi

# drop all the tables in the database
for i in `mysql -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
4
répondu kfox 2013-04-09 20:33:09

si sous linux (ou tout autre système qui supporte la tuyauterie, echo 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.

4
répondu moretti.fabio 2014-11-11 18:17:48

one liner à abandonner toutes les tables d'une base de données:

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 ceci supprimera toutes les tables de DATABASE DATABASE_NAME.

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

3
répondu mgershen 2018-01-01 12:24:13

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 VOTREDB au nom de votre base de données, et évidemment l'utilisateur/pass.

2
répondu nsbucky 2013-08-21 13:38:26

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 acheminera immédiatement vers une seconde instance client qui supprimera les tables.

le morceau intelligent est bien sûr copié à partir d'autres réponses ici - je voulais juste une copie-et-pasteable one-liner (ish) pour réellement do le travail que L'OP voulait.

Note bien sûr, vous devrez mettre vos identifiants en (deux fois) dans ces commandes mysql, aussi, à moins que vous n'ayez une configuration très basse sécurité. (ou vous pouvez alias votre commande mysql pour inclure vos creds.)

2
répondu artfulrobot 2014-07-08 10:27:58

googler sur le sujet m'amène toujours à cette question donc voici le code mysql de travail qui supprime à la fois les tables et les 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`;
2
répondu Sergey Alaev 2018-01-15 12:29:25

S'appuyant sur la réponse de @Dion Truter et @Wade Williams, le script shell suivant fera tomber toutes les tables, après avoir d'abord montré ce qu'il est sur le point d'exécuter, et vous donner une chance d'avorter 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}
1
répondu Philip Callender 2017-03-07 02:05:00

vient de mettre ici quelques utiles commentaire fait par Jonathan Watt pour laisser tomber 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 `"  "`;"}' | $MYSQL
unset MYSQL

Il m'aide et j'espère qu'elle pourra être utile

1
répondu Pavel.Solovyenko 2018-06-24 11:14:11

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

j'ai trouvé cette solution sur une autre question qui fonctionne vraiment 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

qui videra toutes vos tables dans la base de données DB_NAME , et pas seulement afficher la ligne de commande TRUNCATE .

Espérons que cette aide!

0
répondu mokk 2015-08-20 14:07:59

cette solution est basée sur la réponse de @SkyLeach mais avec le soutien de déposer des 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
répondu pgmank 2018-04-04 15:15:16
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
répondu Ernestas Stankevičius 2018-09-14 09:28:36

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 la totalité de la déclaration IF (j'aime la sécurité ajoutée).

-1
répondu Christiaan Maks 2015-02-23 09:05:56

"151910920 de la" Meilleure solution pour moi jusqu'à présent

sélectionnez base de données -> clic droit -> tâches -> générer des Scripts - ouvrira assistant pour générer des scripts. Après avoir choisi des objets dans l'option set Scripting, cliquez sur bouton Avancé . Sous "script DROP and CREATE" sélectionnez Script DROP .

Exécuter script.

-6
répondu azza idz 2016-03-17 14:08:43