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

Existe-t-il un moyen simple et facile de supprimer toutes les tables d’une firebase database MySQL, en ignorant les contraintes de clé étrangère pouvant s’y trouver?

J’ai trouvé l’ensemble des instructions de repository générées utiles et je recommande ces modifications:

  1. Limitez les gouttes générées à votre firebase database 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 instructions DROP, il vous en donne simplement une liste. Vous devrez couper et coller la sortie dans votre moteur SQL pour les exécuter.

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

“RESTRICT et CASCADE sont autorisés à faciliter le portage. En MySQL 5.5, ils ne font rien.”

Par conséquent, pour que les instructions de repository fonctionnent, vous devez:

 SET FOREIGN_KEY_CHECKS = 0 

Cela désactivera les contrôles d’intégrité référentielle. Ainsi, lorsque vous aurez fini d’exécuter les gouttes dont vous avez besoin, vous souhaiterez 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 la sortie de SELECT plus facilement, l’option mysql -B peut vous aider.

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 cela permet de désactiver les contrôles de clés étrangères afin de pouvoir supprimer les tables dans un ordre arbitraire. Il ne répond pas à la manière de générer automatiquement des instructions pour toutes les tables existantes et de les exécuter dans un seul script.) Est-ce que.)

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

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 firebase database en cours d’utilisation. Vous pouvez définir la firebase database actuelle à l’aide de use .


Ou sinon, la réponse acceptée de 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 des caractères spéciaux dans les noms de firebase database 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 

chaque approche ci-dessus comprend 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 

Voici une solution basée sur le 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`; 

Tu peux faire:

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

Ensuite, exécutez les requêtes générées. Ils vont déposer chaque table sur la firebase database actuelle.

Voici une aide sur la commande drop table .

J’ai apporté cette modification à la réponse de Dion Truter pour faciliter la tâche 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 retourne l’intégralité de la chose dans un champ, de sorte que vous pouvez copier une fois et supprimer toutes les tables (utilisez Copy Field Content (unquoted) dans Workbench). Si vous avez BEAUCOUP de tables, vous pouvez rencontrer certaines limites sur GROUP_CONCAT() . Si c’est le cas, augmentez la variable max len (et max_allowed_packet , si nécessaire).

Voici un moyen automatisé 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 -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 

Si sous linux (ou tout autre système prenant en charge 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.

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

Rappelez-vous simplement de changer YOURDB au nom de votre firebase database, et évidemment à l’utilisateur / pass.

Une seule ligne pour déposer toutes les tables d’une firebase database donnée:

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

En cours d’exécution, toutes les tables de la firebase database DATABASE_NAME seront supprimées.

Et ce qui est intéressant, c’est que le nom de la firebase database n’est écrit qu’une seule fois.

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 va générer les commandes, puis les acheminer immédiatement vers une seconde instance client qui supprimera les tables.

La partie la plus intelligente est bien sûr copiée à partir d’autres réponses ici – je voulais juste une copie simple (ish) copiable pour faire le travail recherché par l’OP.

Notez bien sûr que vous devrez également mettre vos identifiants (deux fois) dans ces commandes mysql, à moins que votre configuration de sécurité soit très faible. (ou vous pouvez utiliser la commande mysql pour inclure vos creds).

Googler sur le sujet m’amène toujours à cette question SO alors 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`; 

En s’appuyant sur la réponse de @Dion Truter et @Wade Williams, le script shell suivant supprime 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’abandonner 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} 

Il suffit de mettre ici quelques commentaires utiles faits 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 `" $1 "`;"}' | $MYSQL unset MYSQL 

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

C’est un vieux post, mais aucune des réponses ici n’a vraiment répondu à la question à mon avis, alors 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 videra toutes vos tables dans la firebase database DB_NAME et affichera non seulement la ligne de commande TRUNCATE .

J’espère que cela t’aides!

Cette solution est basée sur la réponse de @SkyLeach, mais avec le support 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 

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 firebase database ou supprimez l’intégralité de l’instruction IF (j’aime la sécurité supplémentaire).

La meilleure solution pour moi jusqu’à présent

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 objects dans l’option Script définie, cliquez sur le bouton Avancé . Sous “Script DROP and CREATE”, sélectionnez Script DROP .

Script de lancement.