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

Résolu/Fermé
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 13 juin 2013 à 12:44
jee pee Messages postés 39578 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 16 avril 2024 - 13 juin 2013 à 18:17
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.

4 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
13 juin 2013 à 17:59
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 39578 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 16 avril 2024 9 221
13 juin 2013 à 12:55
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 39578 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 16 avril 2024 9 221
13 juin 2013 à 13:14
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 39578 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 16 avril 2024 9 221
13 juin 2013 à 18:17
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