Comment supprimer toutes les tables MySQL de la ligne de commande?

29

Habituellement, j'ouvre Terminal.app et me connecte à une base de données MySQL distante.

Ensuite, j'utilise cette commande pour déposer une table:

mysql> drop table [table name];

Mais ce dont j'ai besoin, c'est de la ligne de commande pour supprimer toutes les tables de la base de données.

Si j'utilise:

mysql> drop database [database name];

Je détruirai complètement la base de données et je ne pourrai plus créer de tables. Ai-je raison?

chefnelone
la source

Réponses:

27

Vous pouvez supprimer la base de données puis la recréer immédiatement:

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

Ou vous pouvez utiliser un script pour supprimer chaque table de la base de données.

William Jackson
la source
ok, juste pour être sûr: je me connecte à une base de données distante dans Terminal avec cette ligne: / Applications / MAMP / Library / bin / mysql -h 80.54.554.10 -u adm_user -p my_db . Après avoir supprimé et créé la base de données comme vous l'avez dit, devrais-je modifier ces valeurs de connexion ou elles restent les mêmes?
chefnelone
1
@chef - Supprimer toutes les tables et supprimer toute la base de données n'a pas le même effet. Si vous supprimez uniquement les tables, toutes les autorisations de base de données resteront, pas si vous supprimez / recréez la base de données.
Nifle
10
@chefnelone: ​​Soyez prudent !!! La suppression d'une base de données supprime également les procédures stockées et les vues définies par l'utilisateur.
RolandoMySQLDBA
Tout à fait clair pour moi. J'irai avec le script pour supprimer chaque table.
chefnelone
1
c'est totalement dangereux, voir les commentaires http://stackoverflow.com/a/12403742/1713660
vladkras
10

Vous pouvez essayer la commande suivante:

mysqldump --no-data --add-drop-table DB_NAME | grep ^DROP | mysql -v DB_NAME

Ou:

mysql --silent --skip-column-names -e "SHOW TABLES" DB_NAME | xargs -L1 -I% echo 'DROP TABLE `%`;' | mysql -v DB_NAME

DB_NAMEest le nom de votre base de données. Informations d'identification de la base de données que vous pouvez spécifier dans ~/.my.cnfou ajouter à la commande (par exemple -uroot -proot).

Cette méthode présente certains avantages par rapport à la suppression et à la création de la base de données au cas où votre utilisateur de base de données ne serait pas autorisé à la supprimer.

kenorb
la source
1
Deuxième exemple confirmé, génial. Ajoutez des informations d'identification db comme indicateurs supplémentaires avant --silentet -v/ --verboserespectivement comme:--user=username --password=password --host=host.name
ici
Bonne idée. Mais ayez un problème quand il y a une clé étrangère. J'ajoute | sort -rà la ligne inverse, mais toujours pas compatible certains db.
Fancyoung
2

mysql -u USERHERE -pPASSWORDHERE --silent --skip-column-names -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%;' | mysql -u USERHERE -pPASSWORDHERE -v DATABASENAMEHERE

sveilleux2
la source
2
Bienvenue sur Super User! Bien que cela puisse répondre à la question, ce serait une meilleure réponse si vous pouviez expliquer pourquoi . Nous recherchons des réponses complètes et de haute qualité qui fournissent une explication et un contexte. Ne vous contentez pas de donner une réponse sur une seule ligne; expliquez pourquoi votre réponse est juste, idéalement avec des citations. Les réponses qui ne contiennent pas d'explications peuvent être supprimées. Vérifiez également votre mise en forme.
G-Man dit `` Réinstalle Monica ''
N'oubliez pas de définir foreign_key_checks = 1 après les tables de dépôt: voir stackoverflow.com/a/2873991/4306855 mysql -u USERHERE -pPASSWORDHERE --silent --skip-column-names -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%; SET FOREIGN_KEY_CHECKS = 1; ' | mysql -u USERHERE -pPASSWORDHERE -v DATABASENAMEHERE
toto21