[MySQL] Remplacement dans toute la base de données
Résolu
KX
Messages postés
19031
Statut
Modérateur
-
jee pee Messages postés 31892 Date d'inscription Statut Modérateur Dernière intervention -
jee pee Messages postés 31892 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je cherche à remplacer toutes les occurrences de caractères de toutes les colonnes de toutes les tables de ma base de données.
J'ai récupéré le nom de mes colonnes comme ceci :
Et je voudrais appliquer un UPDATE REPLACE comme ceci :
NB. Le remplacement de "a" en "A" n'est qu'un exemple, mon problème est plutôt de savoir comment lier les table_name et column_name entre mes deux requêtes.
J'ai essayé avec des sous-select, genre :
Mais j'ai toujours des erreurs quand j'essaye. Quelle est la bonne méthode pour faire ça ?
Merci d'avance.
--
La confiance n'exclut pas le contrôle
Je cherche à remplacer toutes les occurrences de caractères de toutes les colonnes de toutes les tables de ma base de données.
J'ai récupéré le nom de mes colonnes comme ceci :
select table_name,column_name from information_schema.columns;
Et je voudrais appliquer un UPDATE REPLACE comme ceci :
update table_name set column_name = replace(column_name,"a","A");
NB. Le remplacement de "a" en "A" n'est qu'un exemple, mon problème est plutôt de savoir comment lier les table_name et column_name entre mes deux requêtes.
J'ai essayé avec des sous-select, genre :
update (select table_name as tables from information_schema.tables) set (select column_name from information_schema.columns as columns where table_name=tables) = replace(columns,"a","A");
Mais j'ai toujours des erreurs quand j'essaye. Quelle est la bonne méthode pour faire ça ?
Merci d'avance.
--
La confiance n'exclut pas le contrôle
4 réponses
-
Merci de ta réponse, je n'ai pas réussi à faire ça directement avec SQL, mais du coup j'ai fais ça en Java (je maîtrise mieux)
Voici ce que ça donne :
import java.sql.*; public class Replace { public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bdd","root",""); Statement stmt = conn.createStatement(); ResultSet select = stmt.executeQuery( "select " + "concat('update ',table_name,' set ',column_name,' = replace(',column_name,',\"a\",\"A\");') " + "from information_schema.columns where table_schema = 'bdd'"); while (select.next()) { String query = select.getString(1); // UPDATE table_name SET column_name = REPLACE(column_name,"a","A"); Statement update = conn.createStatement(); try { update.execute(query); System.out.println(query); } catch (Exception e) { System.err.println(query); System.err.println(e); } update.close(); } stmt.close(); conn.close(); } } -
Salut,
Je ne connais pas mysql, mais si je voulais faire une opération de ce type, sans me casser la tête, je passerais par la génération d'un script tout bête :
spool maj.sql
select 'update '||table_name||' set '||column_name||' = replace('||column_name||',"a","A");' from information_schema.columns;
Et donc j'obtiens un script sql qui contient autant de lignes que de colonnes dans les tables.
cdlt
-
Ce que tu cherches à faire s'appelle du Sql Dynamique.
Sous Oracle c'est impossible à faire directement en sql. Il faut passer par la création de procédures ou de fonctions.
-
Chacun ses outils ;-)
Si on maitrise un editeur comme vi c'est tout simple, il suffit d'avoir la liste resultant de select table_name,column_name from information_schema.columns;
dans un fichier texte, et après avec des replace on reconstitue l'update.