Comment supprimer mes tables qui ont toutes le préfixe myprefix_
?
Note: il faut l'exécuter dans phpMyAdmin
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_%';
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.
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;
@ 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.
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;
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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.
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;
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.
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;