2009-09-21 5 views
1

Je veux garder t1, t2 et supprimer toutes les autres tables.Existe-t-il une commande MySQL pour implémenter quelque chose comme "drop tables sauf t1, b2"?

+0

Si vous vouliez supprimer toutes les tables mais pas la base de données elle-même, que feriez-vous pour cela? Utilisez le même tour mais excluez ceux-ci ... –

+0

@Workshop Alex, désolé, ne vous a pas attrapé. – omg

+0

Normalement, lorsque vous voulez supprimer toutes les tables, vous supprimez simplement la base de données. (Cela supprimera également les procédures stockées et les vues qui pourraient devenir invalides de cette façon.) Si vous voulez supprimer uniquement les tables, vous devez les supprimer une par une. Si vous voulez tout supprimer, sauf les deux, vous devez toujours les supprimer un par un, mais ignorer la suppression pour ceux qui doivent rester. –

Répondre

6

Vous pouvez utiliser information_schema pour rechercher des noms de table et même formater les résultats sous la forme d'un groupe d'instructions DROP.

SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ') 
    FROM information_schema.tables 
    WHERE table_schema = DATABASE() AND table_name NOT IN ('foo', 'bar', 'baz'); 

(La fonction DATABASE() renvoie le moment use « base de données d.)

En utilisant PREPARE et EXECUTE, vous pouvez même éviter le copier & coller et (dans MySQL 5.0.13 et versions ultérieures) écrire un stocké procédure pour le faire.

+0

C'est ce que je voulais dire. :-) Ou quelque chose comme ça. –

+1

Je ferais très attention à mettre ceci en live code. La suppression de tables est généralement une tâche dbadmin ou cron/control plutôt qu'une tâche à coder. Sinon, le droit de supprimer des tables ne devrait jamais être attribué au code en direct qui pourrait être plus tard vulnérable à XSS. –

1

Vous pouvez utiliser mysqldump pour générer une liste d'instructions DROP TABLE, filtrer celles que vous ne voulez pas, puis les rediriger dans le client mysql. Voici comment nous construisons que jusqu'à

Tout d'abord, voici une liste des déclarations de table DROP TABLE pour la base de données

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \ 
grep ^DROP 

Maintenant, nous pouvons tuyau à travers grep avec -v pour inverser le match - nous voulons des déclarations que don « t mentionner les tables nous retenir (une autre façon de faire serait d'options --ignore tables à mysqldump)

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \ 
grep ^DROP | 
grep -v 'foo\|bar' 

Enfin, une fois que vous êtes confiant, vous pouvez tuyau de nouveau dans MySQL

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \ 
grep ^DROP | \ 
grep -v 'foo\|bar' | \ 
mysql -uUSERNAME -pPASSWORD DATABASE 
Questions connexes