DROP TABLE (
SELECT table_name
FROM information_schema.`TABLES`
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%');
Je sais que ça ne marche pas! Quel est l'équivalent de quelque chose comme ça en SQL? Je peux créer un simple script Python pour ce faire, mais je me demandais simplement si nous pouvions faire quelque chose directement avec SQL. J'utilise MySQL. Merci!
Vous pouvez utiliser déclarations préparées -
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name,'`') INTO @tables FROM information_schema.tables
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%';
SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
Il va générer et exécuter une instruction comme celle-ci -
DROP TABLE myDatabase.del1, myDatabase.del2, myDatabase.del3;
Une amélioration mineure de @ réponse de Devart :
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.`', table_name, '`') INTO @tables FROM
(select * from
information_schema.tables
WHERE table_schema = 'myDatabase' AND table_name LIKE 'del%'
LIMIT 10) TT;
SET @tables = CONCAT('DROP TABLE ', @tables);
select @tables;
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
Ce script doit être exécuté à plusieurs reprises jusqu'à ce que la sortie de la console soit NULL
Les changements sont les suivants:
LIMIT
pour éviter le problème de troncature sur lequel j'ai commentéselect @tables;
) pour avoir une sorte de contrôle quand arrêter l'exécution du scriptSi vous avez juste besoin de supprimer rapidement un tas de tables (pas en SQL pur, donc sans répondre directement à cette question), une commande Shell d'une ligne peut le faire:
echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
J'ai trouvé utile d'ajouter un IFNULL aux solutions de Devart pour éviter de générer une erreur s'il n'y a pas de tables correspondant à la requête.
SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');