63 votes

Baisse de bases de données MySQL correspondant à certains génériques?

Je suis runing mySQL sur un serveur où j'ai besoin de déplacer des tonnes de bases de données (après quelques essais avec le serveur). Toutes les bases de données que j'ai besoin de drop ont le même préfixe "Whatever_".

Après le préfixe, les noms sont aléatoires. Donc, vous avez votre Whatever_something, Whatever_232, Whatever_blabla, .... , Whatever_imthelast.

Je vais faire ce travail tout à fait quelques fois, donc je me demandais quelle serait la meilleure façon de le faire?

EDIT: Je peux utiliser n'importe quel type de langue ou de plug-in pour mysql... donc nous POUVONS le faire d'une certaine manière. Maintenant, j'ai demandé au gars qui génère les bases de données de m'en donner un .txt avec chaque nom dans une ligne... donc im codage d'un rapide php qui va prendre un fichier et supprimer toutes les bases de données en elle, plus tard, je vais essayer le % de réponse(si il fonctionne, il faut de la bonne réponse pour vous assurer que ses la façon la plus facile). De toute façon, je voudrais pour ce faire, le moyen le plus facile coz je ne vais pas être en mesure de soutenir ce code(un autre gars, et vous le savez bien... )

edit 2: L'utilisation d'un générique ne fonctionne pas: #1008 - ne Peut pas laisser tomber de la base de données 'whatever_%'; base de données n'existe pas

89voto

scraimer Points 7000

L'idée de base est de courir "show tables" dans votre base de données, et utiliser les résultats pour sélectionner le les tables que vous voulez. Je ne pense pas que MySQL vous permet de faire quoi que ce soit avec le jeu de résultats à partir de "show tables", mais je suis probablement mal.

Voici un rapide et sale de la solution à l'aide de la coque:

mysql -u your_user -D your_database_name -e "show tables" -s | 
  egrep "^Whatever_" | 
  xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

Qui affichera toutes les commandes shell à déposer les tables commençant par "Whatever_". Si vous voulez vraiment de l'exécution de ces commandes, supprimer le mot "echo".

EDIT: j'ai oublié d'expliquer la dessus! Je ne sais pas comment vous vous serez familiarisé avec les scripts shell, mais va ici:

mysql -u your_user -D your_database_name -e "show tables" -s

imprime une liste de toutes vos tables, avec l'en-tête "Tables_in_your_database_name". La sortie à partir de ce qui est joué (le symbole | signifie "courante", comme dans le passé-on) par le biais de la commande suivante:

egrep "^Whatever_"

recherche les lignes qui commencent (qui ^ symboles signifie "êtres"), le mot "Whatever_" et imprime uniquement ceux-ci. Enfin, nous avons tuyau de liste de "Whatever_*" les tables via la commande:

xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

qui prend chaque ligne de la liste des noms de table, et l'insère à la place de "@@" dans la commande

echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

Donc, si vous aviez un tas de tables nommées "Whatever_1", "Whatever_2", "Whatever_3", les commandes générées serait:

echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1"
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2"
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3"

Qui de sortie suivantes:

mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1"
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2"
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3"

J'espère que c'était assez en détail, et que je ne suis pas juste battre n'importe qui sur la tête avec trop d'informations. Bonne chance, et être prudent lors de l'utilisation de la "DROP TABLE" commande!

38voto

tver3305 Points 1605

Le principe de la réponse par scraimer est correct, mais depuis que la question a été sur la suppression d'une base de données non une table dans une base de données, la commande correcte devrait être:

mysql -u your_username -p'your password' -e 'show databases' 
| grep Whatever_* 
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`"

Pour les explications de la commande, regardez scraimer'explication.

Le dernier morceau... \`@@\` nous avons notre base de données résultante nom cité dans bacticks(`) dans le cas de notre base de données nom comporte des caractères spéciaux comme `-`

Cheers

15voto

Explorer Points 61

Nous pouvons faire cela avec des procédures stockées. Voici une ci-dessous:

drop procedure if exists droplike;
delimiter //
create procedure droplike(pattern varchar(20))
begin
  set group_concat_max_len = 65535;
  select @drop:= concat( 'drop table ', group_concat(table_name) , ';' ) from information_schema.tables where table_schema = "database_name" and table_name like pattern;
  prepare statement from @drop;
  execute statement;
end //
delimiter ;

Remplacer database_name avec le nom de la base de données (écriture autorisation nécessaire). Pour supprimer des tables avec le modèle XYZ appel de la procédure avec l'entrée comme XYZ suivie par wild-card, comme indiqué ci-dessous:

call droplike("XYZ%");

1voto

arshabh Points 11

eh bien, je pense que vous ne pouvez pas supprimer de multiples bases de données MySql.

Mais j'ai un très geek solution. vous pouvez programmer en C/C++/C#/JAVA imprimer un grand nombre de fois "DROP DATABASE WHATEVER_<name>;" dans un bloc-notes ou un éditeur de texte. Après cela, vous pouvez copier-coller dans le client invite de commande de MySql et là vous allez. n'oubliez pas le ";" après chaque DROP commande.

Je crois que c'est possible. essayez d'écrire cette.

1voto

mike rodent Points 482

que dire de ce (Jython)?

rs = stmt.executeQuery( "SHOW DATABASES LIKE 'Whatever_%'" )
databases_for_dropping = []
while rs.next():
  databases_for_dropping.append( rs.getString( 1 ))
for database_for_dropping in databases_for_dropping:
  stmt.execute( "DROP DATABASE %s" % database_for_dropping ) 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X