J'ai mis à jour ma réponse pour effectuer la suppression des tables sans utiliser de procédure stockée. Essaie !!!
RolandoMySQLDBA
Réponses:
11
Voici une procédure stockée qui accepte la base de données et la chaîne de préfixe comme paramètres:
DELIMITER $$DROPPROCEDURE DropTablesWithPrefix $$CREATEPROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGINDECLARE ndx,maxidx INT;DECLARE giventable,SQLSTMT VARCHAR(500);CREATETABLE TableZapList(
droptablesql VARCHAR(512),
idx INT NOTNULL AUTO_INCREMENT PRIMARYKEY) ENGINE=MyISAM;INSERTINTO TableZapList (droptablesql)SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)FROM information_schema.tablesWHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx))= prfx;SELECT COUNT(1)INTO maxid FROM TableZapList;IF maxid =0THEN
LEAVE StoredProcedure;ENDIF;<BR>SET ndx =0;WHILE ndx < maxid DOSET ndx = ndx +1;SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;SET@sql = SQLSTMT;
PREPARE stmt FROM@sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;ENDWHILE;<BR>SELECT droptablesql FROM TableZapList;DROPTABLE TableZapList;END;
DELIMITER ;
MISE À JOUR 2011-07-12 14:55 EDT
Je viens de penser à une manière plus propre et simpliste. Au lieu d'utiliser une procédure stockée, utilisez simplement la fonction GROUP_CONCAT pour rassembler toutes les tables à zapper. Composez ensuite en une seule requête:
Voici une requête pour supprimer toutes les tables commençant par wp_pol dans la base de données actuelle:
Le script Rolandos fonctionne mais il peut être nécessaire d'augmenter le paramètre group_concat_max_len si vous avez beaucoup de tables ou des noms de table très longs: SET SESSION group_concat_max_len = 1000000;
JohnP
Au lieu de changer groupe + concat_max_len, j'ai utilisé une sous-requête avec une limite et effectué les baisses par étapes
pedromanoel
La SUBSTRcondition dans le INSERTdevrait être: SUBSTR(table_name, 1, LENGTH(prfx)) = prfxalors ça marche bien.
laurent
8
Tout d'abord, générez un script pour ce faire à l'invite Unix:
$ echo "select concat('drop table ', table_name, ';') from information_schema.tables where table_name like 'prefix_%';"|mysql --user=root --password=blah --batch >drop.sql
Remplacez le préfixe par le vôtre. L' --batchoption supprime le formatage sophistiqué que MySQL fait par défaut afin que vous puissiez produire un script SQL exécutable.
Passez en revue le script et s'il semble OK, exécutez drop.sqlà l' mysql>invite.
j'ai déjà fait un script d'aide php pour ce faire, mais je me demandais si cela pouvait être fait en utilisant une seule requête.
poelinca
1
Réponse simple: Non. Réponse complexe: Oui, si vous l'enveloppez dans une procédure stockée . Vous pouvez donc l'exécuter en une seule commande, mais ce serait la même chose que d'appeler un script.
Gaius
4
Vous devez interroger les tables système pour ces noms de table et créer une chaîne pour l'exécuter dynamiquement. Dans SQL Server, je ferais quelque chose comme:
declare@x varchar(max),@enter char(2);select@x ='',@enter = char(13)+char(10);Select@x =@x +'drop table '+ table_name +';'+@enter
from information_schema.tables
where table_name like'%accounting%'print@x
execute(@x);
Vous devez maintenant trouver la table système correspondante dans MySQL.
J'ai lu votre réponse très attentivement. C'est aussi ma réponse. Bien qu'en dialecte SQL Server, votre réponse est, en principe, la première bonne réponse. +1 !!!
RolandoMySQLDBA
3
Pour répondre à votre question, non. Pas dans MySQL en utilisant une seule commande / requête. Vous devrez enchaîner les commandes.
Cependant, si vous souhaitez atteindre votre objectif, voici une façon:
À partir d'un script bash, quelque chose comme:
#/bin/bash
TABLES=`mysql -s -e "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) AS T FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'dp_%'"-u user-p`for i in$TABLES;
do
echo "DROP TABLE $i;">> drops.sql ;
done
cat drops.sql
Examinez ensuite le fichier drops.sql. Si tout va bien, faites une SAUVEGARDE , puis ...
mysql -u username -p -v --show-warnings < drops.sql
Vous pouvez toujours utiliser un ADMINISTRATEUR DE BASE DE DONNÉES comme navicat et ce genre de problèmes disparaîtra avec une simple sélection et suppression.
Réponses:
Voici une procédure stockée qui accepte la base de données et la chaîne de préfixe comme paramètres:
MISE À JOUR 2011-07-12 14:55 EDT
Je viens de penser à une manière plus propre et simpliste. Au lieu d'utiliser une procédure stockée, utilisez simplement la fonction GROUP_CONCAT pour rassembler toutes les tables à zapper. Composez ensuite en une seule requête:
Voici une requête pour supprimer toutes les tables commençant par wp_pol dans la base de données actuelle:
La prochaine chose à faire est d'en stocker le résultat dans
La dernière chose est d'exécuter le SQL dynamique en utilisant ces trois (3) commandes:
Voici une démonstration utilisant MySQL 5.5.12 sous Windows qui fonctionne:
Essaie !!!
la source
SUBSTR
condition dans leINSERT
devrait être:SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
alors ça marche bien.Tout d'abord, générez un script pour ce faire à l'invite Unix:
Remplacez le préfixe par le vôtre. L'
--batch
option supprime le formatage sophistiqué que MySQL fait par défaut afin que vous puissiez produire un script SQL exécutable.Passez en revue le script et s'il semble OK, exécutez
drop.sql
à l'mysql>
invite.la source
Vous devez interroger les tables système pour ces noms de table et créer une chaîne pour l'exécuter dynamiquement. Dans SQL Server, je ferais quelque chose comme:
Vous devez maintenant trouver la table système correspondante dans MySQL.
la source
Pour répondre à votre question, non. Pas dans MySQL en utilisant une seule commande / requête. Vous devrez enchaîner les commandes.
Cependant, si vous souhaitez atteindre votre objectif, voici une façon:
À partir d'un script bash, quelque chose comme:
Examinez ensuite le fichier drops.sql. Si tout va bien, faites une SAUVEGARDE , puis ...
la source
Vous pouvez toujours utiliser un ADMINISTRATEUR DE BASE DE DONNÉES comme navicat et ce genre de problèmes disparaîtra avec une simple sélection et suppression.
la source