Comment supprimer mes tables qui ont toutes le préfixe myprefix_
?
Remarque: besoin de l'exécuter dans phpMyAdmin
Comment supprimer mes tables qui ont toutes le préfixe myprefix_
?
Remarque: besoin de l'exécuter dans phpMyAdmin
Réponses:
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_%';
[...] LIKE 'myprefix\_%';
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.
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 \n
par 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;
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.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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;
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.
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;
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;
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 .
\G
au lieu de ;
donne une sortie un peu plus propre