[MySQL] Remplacement dans toute la base de données

Résolu
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -  
jee pee Messages postés 41548 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 :

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.
A voir également:

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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();
    }
}
1
jee pee Messages postés 41548 Date d'inscription   Statut Modérateur Dernière intervention   9 723
 
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
0
jee pee Messages postés 41548 Date d'inscription   Statut Modérateur Dernière intervention   9 723
 
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.
0
jee pee Messages postés 41548 Date d'inscription   Statut Modérateur Dernière intervention   9 723
 
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.
0