web-dev-qa-db-fra.com

Comment supprimer toutes les tables MySQL de la ligne de commande sans les autorisations de la base de données DROP?

Comment puis-je supprimer toutes les tables dans Windows MySQL, en utilisant l'invite de commande? La raison pour laquelle je veux faire cela est que notre utilisateur a accès aux suppressions de base de données, mais pas à recréer la base de données elle-même, pour cette raison nous devons supprimer les tables manuellement. Est-il possible de supprimer toutes les tables en même temps? Gardez à l'esprit que la plupart des tables sont liées à des clés étrangères et qu'elles devraient donc être supprimées dans un ordre spécifique.

209
Mantas

Vous pouvez générer une instruction comme celle-ci: DROP TABLE t1, t2, t3, ..., puis utiliser des instructions préparées pour l'exécuter:

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'database_name'; -- specify DB name here.

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1; 
295
Devart

La version de @ Devart est correcte, mais voici quelques améliorations pour éviter les erreurs. J'ai modifié la réponse de @ Devart, mais elle n'a pas été acceptée.

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

Ce script ne générera pas d'erreur avec un résultat NULL si vous avez déjà supprimé toutes les tables de la base de données en ajoutant au moins une table inexistante - "fictive".

Et cela a été corrigé au cas où vous auriez plusieurs tables.

Et cette petite modification pour supprimer toutes les vues existe dans la base de données

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @views = NULL;
SELECT GROUP_CONCAT('`', TABLE_NAME, '`') INTO @views
  FROM information_schema.views
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@views,'dummy') INTO @views;

SET @views = CONCAT('DROP VIEW IF EXISTS ', @views);
PREPARE stmt FROM @views;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

Cela suppose que vous exécutiez le script à partir de la base de données que vous souhaitez supprimer. Ou lancez ceci avant:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;

Merci à Steve Horvath pour découvrir le problème avec les backticks.

262
Kostanos

Essaye ça.

Cela fonctionne même pour les tables avec des contraintes (relations de clé étrangère). Sinon, vous pouvez simplement supprimer la base de données et la recréer, mais vous n’avez peut-être pas les autorisations nécessaires pour le faire.

mysqldump -u[USERNAME] -p[PASSWORD] \
  --add-drop-table --no-data [DATABASE] | \
  grep -e '^DROP \| FOREIGN_KEY_CHECKS' | \
  mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Afin de surmonter les effets de vérification de la clé étrangère, ajoutez show table à la fin du script généré et exécutez plusieurs fois jusqu'à ce que la commande show table donne un jeu vide.

73
MutantMahesh

Vous pouvez abandonner le database puis le recréer avec le suivant: -

mysql> drop database [database name];
mysql> create database [database name];
44
user1086159

La réponse acceptée ne fonctionne pas pour les bases de données contenant un grand nombre de tables, par exemple. Bases de données Drupal. Au lieu de cela, voyez le script ici: https://stackoverflow.com/a/12917793/1507877 qui fonctionne sur MySQL 5.5. ATTENTION: autour de la ligne 11, il existe un "WHERE table_schema = SCHEMA ();" Cela devrait plutôt être "WHERE table_schema = 'INSERT NOM DE LA DB DANS LAQUELLE L'IMPORTATION OCCURERA"; "

6
Giles B