93 votes

SQL : suppression des tables avec préfixe

Je sais comment supprimer mes tables dans MySQL,

DROP TABLE

Comment supprimer mes tables qui ont toutes le préfixe myprefix_ ?

Note : vous devez l'exécuter dans phpMyAdmin.

164voto

Andre Miller Points 6713

Vous ne pouvez pas le faire avec une seule commande MySQL, mais vous pouvez utiliser MySQL pour construire la déclaration pour vous :

Dans le shell MySQL ou via PHPMyAdmin, utilisez la requête suivante

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

Cela génère une instruction DROP que vous pouvez ensuite copier et exécuter pour supprimer les tables.

EDIT : Un avertissement ici - la déclaration générée ci-dessus va supprimer toutes les tables dans toutes les bases de données avec ce préfixe. Si vous voulez vous limiter à une base de données spécifique, modifiez la requête pour qu'elle ressemble à ceci et remplacez nom_base par votre propre nom_base :

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';

31voto

Bradley Slavik Points 154

Certaines des réponses précédentes étaient très bonnes. J'ai rassemblé leurs idées avec quelques notions provenant d'autres réponses sur le web.

Je devais supprimer toutes les tables commençant par 'temp_'. Après quelques itérations, je suis arrivé à ce bloc de code :

-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = 'my_database'
                AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

J'espère que cela sera utile à d'autres programmeurs MySQL/PHP.

21voto

Daniel Points 31
show tables like 'prefix_%';

copier les résultats et les coller dans un éditeur de texte ou sortir la requête dans un fichier, utiliser quelques recherches et remplacements pour supprimer le formatage et les remplacements non désirés \n avec une virgule mettre un ; à l'extrémité et ajoutez une table basse à l'avant.

vous obtiendrez quelque chose qui ressemble à ça :

drop table myprefix_1, myprefix_2, myprefix_3;

10voto

infinity Points 4236

@andre-miller c'est bien mais il existe une solution encore meilleure et légèrement plus professionnelle qui vous aidera à tout exécuter en une seule fois. Vous aurez toujours besoin de plus d'une commande mais cette solution vous permettra d'utiliser le SQL pour les constructions automatisées.

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES
    WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;

Note : ce code est dépendant de la plateforme, il est pour MySQL mais il pourrait certainement être implémenté pour Postgre, Oracle et MS SQL avec de légers changements.

2voto

Asaph Points 56989

Vous pouvez faire cela en une seule commande avec MySQL :

drop table myprefix_1, myprefix_2, myprefix_3;

Vous devrez probablement construire la liste des tables de façon dynamique dans le code.

Une approche alternative consisterait à utiliser le bibliothèque de routines à usage général pour MySQL 5.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X