web-dev-qa-db-fra.com

SQL: suppression de tables avec préfixe

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

Note: il faut l'exécuter dans phpMyAdmin

90
Deniz Zoeteman

Vous ne pouvez pas le faire avec une seule commande MySQL, cependant 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érera une instruction DROP que vous pourrez copier et exécuter pour supprimer les tables.

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

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

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

J'avais besoin de supprimer toutes les tables commençant par 'temp_' Après quelques itérations, je suis arrivé avec 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 aux autres programmeurs MySQL/PHP.

30
Bradley Slavik
show tables like 'prefix_%';

copiez les résultats et collez-les dans un éditeur de texte ou exportez la requête dans un fichier, effectuez quelques recherches et remplace pour supprimer la mise en forme indésirable et remplacez \n avec une virgule, mettez un ; à la fin et ajouter une table de travail au premier plan.

vous obtiendrez quelque chose qui ressemble à ceci:

drop table myprefix_1, myprefix_2, myprefix_3;
21
Daniel

@ andre-miller la solution est bonne mais il existe encore mieux et légèrement plus professionnelle qui vous aidera à exécuter tout en une fois. Vous aurez toujours besoin de plusieurs commandes, mais cette solution vous permettra d’utiliser le code SQL pour les générations 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;

Remarque: ce code dépend de la plate-forme, il est destiné à MySQL, mais il peut être implémenté pour Postgre, Oracle et MS SQL avec de légères modifications.

10
Alex Rashkov

J'abandonne la table avec succès en modifiant la requête pour aimer ceci

SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
           FROM information_schema.TABLES
          WHERE TABLE_SCHEMA = 'Pandora'
            AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
3
Duong Vo
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
3
Pankaj Khurana

Vous pouvez le faire en une seule commande avec MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Cependant, vous devrez probablement créer la liste de tables de manière dynamique dans le code.

Une autre approche consisterait à utiliser bibliothèque à usage général pour MySQL 5.

2
Asaph

Je voulais juste publier le code SQL exact que j'ai utilisé - c'est en quelque sorte un mélange des 3 principales réponses:

SET GROUP_CONCAT_MAX_LEN=10000;

SET @del = (
    SELECT      CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
    FROM        information_schema.TABLES

    WHERE       TABLE_SCHEMA = 'database_name'
    AND         TABLE_NAME LIKE 'prefix_%'
);

PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
2
Danny Beckett

J'ai trouvé que les déclarations préparées étaient un peu difficiles à obtenir pour travailler pour moi, mais régler le GROUP_CONCAT_MAX_LEN était essentiel lorsque vous avez beaucoup de tables. Cela a abouti à un processus simple en trois étapes avec couper-coller depuis la ligne de commande mysql qui a fonctionné très bien pour moi:

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

Ensuite, coupez et collez soigneusement l’instruction longue DROP résultante.

1
drchuck

Juste une autre solution utilisant GROUP_CONCAT afin qu’il exécute une requête de type Drop telle que
DROP TABLE table1, table2, ..

SET @Drop_Stm = CONCAT('DROP TABLE ', (
      SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
      WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm;
DEALLOCATE PREPARE Stm;
1
Mohamad Hamouday