IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Remplacer un nom dans toute la base de données


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 20
    Points
    20
    Par défaut Remplacer un nom dans toute la base de données
    Bonjour,

    J'ai le même problème que dans ce sujet mais à l'échelle de la base de donnée entière.
    Je veux remplacer une chaîne de caractère par une autre dans toute la base, quelle est donc la requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE <nomdemabasededonnée>
       SET Name = REPLACE(Name, 'chaine', 'nouvellechaine')
     WHERE LOCATE('chaine', Name) >0
    Informations serveur
    • Serveur : Localhost via UNIX socket
    • Type de serveur : MariaDB
    • Version du serveur : 10.1.31-MariaDB - MariaDB Server
    • phpMyAdmin Version : 4.7.7


    Merci d'avance pour vos retours.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pas de magie, il faut dans un premier temps interroger le catalogue MySQL qui contient les tables et les colonnes afin générer les ordres SQL de mise à jour et dans un second temps les exécuter.
    Si votre base est conséquente, ça va prendre du temps.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    Bonjour et merci de votre retour, mais je ne rien compris à ce que vous avez dit !!
    il n'y a pas de requête pour remplacer une chaîne de caractère dans uje base de donnée MySQL ?

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Une mise à jour dans une base de données se fait par un ordre UPDATE. Or cet ordre se rapporte à une table ou à une vue, pas à l'ensemble des structures d'une base de données !
    Pour mettre à jour une chaine de caractères dans toutes les tables concernées, il faut donc savoir dans quelle(s) table(s) se trouve la ou les colonne(s) qui contien(en)t cette chaine de caractères.

    Donc, il faut interroger le catalogue de la BDD pour récupérer la liste de toutes les tables, puis, exécuter une requête update autant de fois que nécessaire.
    La requête pourra être construite par SQL dynamique

    Attention aussi : qui dit chaine de caractères, dit sensibilité à la collation, l'ordre update peut éventuellement être impacté si la collation n'est pas la même dans toutes les tables

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    Merci beaucoup de ces explications ! C’est quoi une collation ?

  6. #6
    Membre averti Avatar de Amélie Ladoque
    Inscrit en
    Novembre 2004
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 251
    Points : 310
    Points
    310
    Par défaut
    Un peu de recherche dans la documentation peut être ?
    https://dev.mysql.com/doc/refman/5.7...t-general.html
    Cela permet de répondre, par exemple, au problème classique de la sensibilité à la casse.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    Merci de vos retours. je vous souhaite une bonne journée. Je vais me coucher moins bête ce soir...
    Et j'ai bien compris que ma requête ne peut s'appliquer qu'au table et non à la DdD, dommage, cela va être plus long de passer par la recherche, puis de lister toutes les tables, puis d'appliquer le replace, mais c'est comme cela.
    Merci encore à tous.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pourquoi avez-vous besoin de faire cela ?

    N'y aurait-il pas un problème de modélisation de la base de données qui entraîne un enregistrement multiple de la même donnée que vous devez aujourd'hui modifier ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut IED factory.

    Pour répondre à votre question, oui, on peut le faire.
    Cela se fait par l'intermédiaire d'une procédure stockée, qui va se faire en deux temps.
    Dans un premier temps, vous recherchez toutes les colonnes de types chaine de caractères dans votre base de données.

    Quand vous connaissez le nom de la table et le nom de la colonne, vous effectuez la seconde partie.
    Elle consiste à contruire la requête de mise à jour et de l'exécuter, et ainsi de suite.

    Voici ce que je vous propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    --------------
    DROP PROCEDURE IF EXISTS changer
    --------------
     
    --------------
    CREATE PROCEDURE changer(_old  VARCHAR(255),
                             _new  VARCHAR(255))
    DETERMINISTIC
    NO SQL
    BEGIN
            DECLARE _fin      INTEGER DEFAULT 1;
            DECLARE _table    VARCHAR(255);
            DECLARE _colonne  VARCHAR(255);
     
            DECLARE curseur CURSOR FOR
                    SELECT table_name, column_name
                    FROM   information_schema.columns
                    WHERE  table_schema IN ('base')
                    AND    data_type    IN ('varchar','char','tinytext','mediumtext','text','longtext');
     
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin=0;
     
            OPEN curseur;
     
            FETCH curseur INTO _table,_colonne;
     
            WHILE _FIN DO
                    SET @s = concat('update ',_table,' SET ',_colonne,' = replace(',_colonne,',\'',_old,'\',\'',_new,'\') where ',_colonne,' like \'%',_old,'%\';');
     
                    PREPARE stmt FROM @s;
                    EXECUTE stmt;
                    DEALLOCATE PREPARE stmt;
     
                    FETCH curseur INTO _table,_colonne;
            END WHILE;
     
            CLOSE curseur;
    END
    --------------
     
    --------------
    CALL changer('un','deux')
    --------------
     
    Appuyez sur une touche pour continuer...
    Je ne l'ai pas testé.
    Le nom de la base de données est "base".
    Je sélectionne toutes les colonnes ayant comme type : "varchar,char,tinytext,mediumtext,text,longtext".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Cela se fait par l'intermédiaire d'une procédure stockée
    Une proc, pourquoi pas; le principe reste le même : collecter la liste des tables et colonnes concernées puis faire la mise à jour, mais il faut d'abord répondre à la question de fond posée par Cinéphil

    Citation Envoyé par CinePhil Voir le message
    N'y aurait-il pas un problème de modélisation de la base de données qui entraîne un enregistrement multiple de la même donnée que vous devez aujourd'hui modifier ?
    Et si toutefois on ne peut pas corriger la modélisation il faut vérifier si la collation est la même dans toutes les tables et colonnes, type CHAR oblige, sans doute pas facile dans une proc

  11. #11
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Pourquoi avez-vous besoin de faire cela ?

    N'y aurait-il pas un problème de modélisation de la base de données qui entraîne un enregistrement multiple de la même donnée que vous devez aujourd'hui modifier ?
    Bonjour,
    Merci de répondre encore à ce topic.

    Simplement dans le cadre d'une duplication d'un site Fr qui doit servir de base à des sites traduits en langues étrangères...

  12. #12
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut IED factory.

    Pour répondre à votre question, oui, on peut le faire.
    Cela se fait par l'intermédiaire d'une procédure stockée, qui va se faire en deux temps.
    Merci beaucoup pour ce retour, mais je ne sais ce qu'est une procédure stockée et je ne sais pas comment appliquer concrètement et/ou tester votre code ?

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Simplement dans le cadre d'une duplication d'un site Fr qui doit servir de base à des sites traduits en langues étrangères...
    Mouais... pas pratique comme méthode d'internationalisation !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Citation Envoyé par Escartefigue
    Une proc, pourquoi pas; le principe reste le même : collecter la liste des tables et colonnes concernées puis faire la mise à jour, ...
    J'ai répondu à la question suivante :
    Citation Envoyé par IED factory
    Je veux remplacer une chaîne de caractère par une autre dans toute la base, quelle est donc la requête ?
    Citation Envoyé par Escartefigue
    ... mais il faut d'abord répondre à la question de fond posée par Cinéphil
    En quoi une question de faisabilité peut-il engendrer un problème de modélisation ?

    Citation Envoyé par CinePhil
    Pourquoi avez-vous besoin de faire cela ?
    Je suppose qu'il s'agit d'une maintenance pour corriger un défaut mineur.

    La réponse se trouve dans le premier sujet (voir le lien dans le premier message).
    Il s'agit de remplacer un chemin stocké dans la base par un autre chemin. Rien d'extraordinaire.

    Ce qui me dérange, c'est de le faire sur des colonnes de type chaîne de caractères qui n'ont aucun rapport avec le problème rencontré ???

    Citation Envoyé par CinePhil
    N'y aurait-il pas un problème de modélisation de la base de données qui entraîne un enregistrement multiple de la même donnée que vous devez aujourd'hui modifier ?
    A priori, ce n'est pas un problème de modélisation, mais plutôt un problème de volumétrie.
    Pourquoi répéter le chemin absolue vers le répertoire, au lieu de simplement nommer le fichier ?
    En fait, il manque dans une table des paramètres, une colonne contenant le chemin absolue vers le répertoire contenant tous vos fichiers.
    Ainsi cette répétition inutile pourrait faire gagner un peu d'espace de stockage.

    Citation Envoyé par IED factory
    Merci beaucoup pour ce retour, mais je ne sais ce qu'est une procédure stockée et je ne sais pas comment appliquer concrètement et/ou tester votre code ?
    Si vous n'avez pas le niveau pour administrer votre base de données, je ne peux rien faire pour vous.

    Citation Envoyé par CinePhil
    Citation Envoyé par IED factory
    Simplement dans le cadre d'une duplication d'un site Fr qui doit servir de base à des sites traduits en langues étrangères...
    Mouais... pas pratique comme méthode d'internationalisation !
    Bien vu CinePhil ! C'est l'arbre qui cache la forêt.

    Comme vous dites, pour internationaliser un site web, on crée une table contenant tous les libellés de toutes les pages du site web.
    Je ne voie toujours pas le rapport avec la substitution d'une chaîne de caractères dans toutes les tables ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2007
    Messages : 76
    Points : 20
    Points
    20
    Par défaut
    Je clôture ce topic, je n'apprécie pas beaucoup les jugements de valeur et les positions condescendantes. J'ai résolu on problème manuellement... à défaut d'avoir un eu de pédagogie, de compréhension et d'empathie...
    Merci au contributeurs néanmoins et au site developpez.net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Interdire le click droit dans toute ma base de données
    Par kawaya dans le forum Sécurité
    Réponses: 2
    Dernier message: 26/08/2013, 11h31
  2. Réponses: 3
    Dernier message: 14/02/2012, 16h37
  3. [MySQL] Moteur de recherche qui recherche un champ dans toute ma base de données
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/12/2010, 12h28
  4. Réponses: 3
    Dernier message: 21/01/2008, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo