web-dev-qa-db-fra.com

Table de dépôt en masse MySQL où la table comme?

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!

24
ThinkCode

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;
45
Devart

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:

  1. backtick (`) encapsulant le nom de la table (s'il contient des caractères non standard)
  2. a ajouté un LIMIT pour éviter le problème de troncature sur lequel j'ai commenté
  3. ajouté une "impression" (select @tables;) pour avoir une sorte de contrôle quand arrêter l'exécution du script
14
Ron Klein

Si 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
11
Rafael Kitover

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;');
1
A C