SQL: suppression de tables avec préfixe

101

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

Remarque: besoin de l'exécuter dans phpMyAdmin

Deniz Zoeteman
la source

Réponses:

178

Vous ne pouvez pas le faire avec une seule commande MySQL, mais vous pouvez utiliser MySQL pour construire l'instruction 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 ensuite copier et exécuter pour supprimer les tables.

EDIT: Un avertissement ici - l'instruction 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_base_de_données par votre propre nom_base_de_données:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
André Miller
la source
Je n'ai qu'une seule base de données donc je n'aurai pas besoin de la 2ème.
Deniz Zoeteman
4
@ElijahLynn la source de limite est probablement due à la longueur maximale de GROUP_CONCAT. vous pouvez l'agrandir, voir par exemple ici
Asaf David
7
Remarque pour vous-même.Augmentez le nombre de caractères max: SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid
2
Veuillez noter que, dans certains cas, il est nécessaire d'échapper aux [...] LIKE 'myprefix\_%';
traits de
1
Cela renvoie de nombreux noms de table en double. La réponse publiée par Pankaj Khurana fonctionne mieux à mon humble avis.
Jeremy
37

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

J'avais besoin de supprimer toutes les tables commençant par 'temp_' Après quelques itérations, j'ai créé 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.

Bradley Slavik
la source
1
C'est exactement la bonne réponse. D'autres réponses utilisent plusieurs étapes ou nécessitent que cela soit fait manuellement. Je ne sais pas comment cette réponse n'a pas plus de votes après 4 ans!
gbe
25
show tables like 'prefix_%';

copiez les résultats et collez-les dans un éditeur de texte ou affichez la requête dans un fichier, utilisez quelques recherches et remplacements pour supprimer le formatage indésirable et remplacez-les \npar une virgule, mettez un ;à la fin et ajoutez une table de dépôt au début.

vous obtiendrez quelque chose qui ressemble à ceci:

drop table myprefix_1, myprefix_2, myprefix_3;
Daniel
la source
1
Je n'ai pas eu accès à information_schema.tables sur l'hébergeur que j'utilise, c'était donc la voie à suivre, merci!
Florent Roques
10

La solution @ andre-miller est bonne mais il y a encore mieux et un peu plus professionnel qui vous aidera à tout exécuter en une seule fois. Il faudra toujours plus d'une commande, mais cette solution vous permettra d'utiliser le SQL pour les versions 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 pour MySQL mais il est certain qu'il pourrait être implémenté pour Postgre, Oracle et MS SQL avec de légères modifications.

Alex Rashkov
la source
ERREUR 1064 (42000): vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de '@tbls' à la ligne 1 ERREUR 1243 (HY000): Gestionnaire d'instruction préparée inconnu (stmt) donné à EXECUTE ERROR 1243 (HY000): Gestionnaire d'instructions préparées inconnu (stmt) donné à DEALLOCATE PREPARE
Roni Tovi
Erreur de syntaxe à: PREPARE stmt FROM 'DROP TABLE @tbls';
ledawg
5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
Pankaj Khurana
la source
3

J'ai supprimé 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;
Duong Vo
la source
C'est le seul que j'ai trouvé qui a fait toute l'opération en un seul shebang tout en répondant aux contraintes des clés étrangères.
Evan Mattson
2

Vous pouvez le faire en une seule commande avec MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Vous devrez probablement créer la liste des tables de manière dynamique dans le code.

Une approche alternative serait d'utiliser la bibliothèque de routine à usage général pour MySQL 5.

Asaph
la source
2

Je voulais juste publier le 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;
Danny Beckett
la source
2

Juste une autre solution utilisant GROUP_CONCAT afin d'exécuter une requête de suppression comme
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;
Mohamad Hamouday
la source
1

J'ai trouvé que les déclarations préparées étaient un peu difficiles à mettre en œuvre pour moi, mais la configuration GROUP_CONCAT_MAX_LENétait essentielle lorsque vous avez beaucoup de tables. Cela a abouti à un processus simple en trois étapes avec couper-coller à partir de la ligne de commande mysql qui a très bien fonctionné 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, copiez et collez soigneusement la longue instruction DROP résultante .

drchuck
la source
terminer la requête avec \Gau lieu de ;donne une sortie un peu plus propre
Stuart Cardall