SQL: suppression de tables avec préfixe

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

Remarque: il est nécessaire de l'exécuter dans phpMyAdmin

82
demandé sur Brian Tompsett - 汤莱恩 2009-10-19 19:14:44

10 réponses

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 pouvez ensuite copier et exécuter pour supprimer les tables.

EDIT: a disclaimer here-la déclaration générée ci-dessus supprimera toutes les tables dans toutes les bases de données avec ce préfixe. Si vous souhaitez le limiter à une base de données spécifique, modifier la requête pour ressembler à ceci et remplacer database_name par votre propre database_name:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
149
répondu Andre Miller 2009-10-19 15:35:33

certaines des réponses précédentes étaient très bonnes. J'ai rassemblé leurs idées à certains notions tirées d'autres réponses sur le web.

j'ai dû supprimer toutes les tables commençant par "temp_" Après quelques itérations, j'ai trouvé 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.

26
répondu Bradley Slavik 2014-07-14 08:26:57
show tables like 'prefix_%';

copier les résultats et les coller dans un éditeur de texte ou la sortie de la requête à un fichier, utiliser quelques recherches et remplace pour supprimer le formatage indésirable et remplacer \n par une virgule placez un ; à la fin et ajoutez une table de dépose à l'avant.

, vous obtiendrez quelque chose qui ressemble à ceci:

drop table myprefix_1, myprefix_2, myprefix_3;
19
répondu Daniel 2012-11-06 20:33:21

@andre-miller la solution est bonne mais il y a encore mieux et un peu plus professionnel qui vous aidera à exécuter tout en une seule fois. Toujours besoin de plus d'une commande, mais cette solution vous permettra d'utiliser le 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;

Note: ce code est dépendant 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.

10
répondu infinity 2017-05-23 12:26:33

i drop table avec succès par edit query à comme 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
répondu Duong Vo 2014-07-10 05:05:41

vous pouvez faire cela en une seule commande avec MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

vous aurez probablement à construire la liste de table dynamiquement dans le code cependant.

une autre approche consisterait à utiliser la general purpose routine library pour MySQL 5.

2
répondu Asaph 2009-10-19 15:22:50
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
2
répondu Pankaj Khurana 2017-10-05 12:48:16

je voulais juste poster le code SQL exact que j'ai utilisé - c'est quelque chose d'un mélange des trois premières 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;
1
répondu Danny Beckett 2013-11-28 03:57:11

j'ai trouvé que les déclarations préparées étaient un peu difficiles à obtenir travailler pour moi, mais le réglage du GROUP_CONCAT_MAX_LEN était essentiel quand vous avez beaucoup de tables. Cela a abouti à un processus simple en trois étapes avec couper-et coller de 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_%';

puis soigneusement couper-et-coller le résultat long goutte déclaration.

1
répondu drchuck 2013-12-02 04:45:27

juste une autre solution en utilisant GROUP_CONCAT ainsi il exécutera une requête de goutte comme

table de goutte 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;
0
répondu Mohamad Hamouday 2017-11-09 07:29:45