74 votes

Rechercher et remplacer dans toute la base de données mysql

je voudrais faire une recherche et remplacer à l'intérieur d'une base de données entière pas seulement une table.

Comment puis-je modifier le script ci-dessous pour qu'il fonctionne?

update [table_name] set [field_name] = replace ([field_name], '[string_to_find]', '[string_to_replace]');

Dois-je simplement utiliser un astérisque?

update * set [field_name] = replace ([field_name], '[string_to_find]', '[string_to_replace]');

144voto

Dean Rather Points 7856

sqldump dans un fichier texte, recherchez / remplacez, réimportez le sqldump.

53voto

Vishnu Sharma Points 479

Mettre à jour les anciennes URL vers les nouvelles URL dans word-communiqué de Requête mysql:

Mise à JOUR wp_options ENSEMBLE option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com') OÙ option_name = "maison" OU option_name = 'siteurl';

UPDATE wp_posts ENSEMBLE guid = replace(guid, 'http://olddomain.com','http://newdomain.com');

UPDATE wp_posts ENSEMBLE post_content = replace(post_content, 'http://olddomain.com', 'http://newdomain.com');

Mise à JOUR wp_postmeta ENSEMBLE meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');

6voto

symcbean Points 27412

Cela implique fortement que vos données NE SONT PAS NORMALISÉES pour commencer. Vous devriez vraiment arranger ça.

Somteh = quelque chose comme ça devrait fonctionner (NB vous n'avez pas mentionné que vous utilisez d'autres langages - donc c'est écrit comme une procédure stockée MySQL)

  create procedure replace_all(find varchar(255), 
        replce varchar(255), 
        indb varcv=char(255))
 DECLARE loopdone INTEGER DEFAULT 0;
 DECLARE currtable varchar(100);
 DECLARE alltables CURSOR FOR SELECT t.tablename, c.column_name 
    FROM information_schema.tables t,
    information_schema.columns c
    WHERE t.table_schema=indb
    AND c.table_schema=indb
    AND t.table_name=c.table_name;

 DECLARE CONTINUE HANDLER FOR NOT FOUND
     SET loopdone = 1;

 OPEN alltables;

 tableloop: LOOP
    FETCH alltables INTO currtable, currcol; 
    IF (loopdone>0) THEN LEAVE LOOP;
    END IF;
         SET stmt=CONCAT('UPDATE ', 
                  indb, '.', currtable, ' SET ',
                  currcol, ' = word_sub(\'', find, 
                  '\','\'', replce, '\') WHERE ',
                  currcol, ' LIKE \'%', find, '%\'');
         PREPARE s1 FROM stmt;
         EXECUTE s1;
         DEALLOCATE PREPARE s1;
     END LOOP;
 END //
 

Je vous laisse le soin de déterminer comment déclarer la fonction word_sub - j'ai fait assez de programmation gratuite ici.

4voto

Mark Byers Points 318575

Réponse courte: vous ne pouvez pas.

Réponse longue: vous pouvez utiliser INFORMATION_SCHEMA pour obtenir les définitions de table et l'utiliser pour générer dynamiquement les instructions UPDATE nécessaires. Par exemple, vous pouvez commencer par ceci:

 SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_schema'
 

J'essaierais d'éviter de le faire si possible.

1voto

middaparka Points 33832

Ce n'est pas possible, vous devez effectuer une mise à JOUR pour chaque tableau individuellement.

AVERTISSEMENT: DOUTEUSE, MAIS ÇA MARCHERA (PROBABLEMENT) LA SOLUTION SUIVANTE

Sinon, vous pouvez faire un dump de la base de données via mysqldump et effectuez simplement le chercher/remplacer sur la résultante fichier SQL. (Je vous recommande offlining tout ce qui peut toucher à la base de données alors que c'est en cours, ainsi que l'utilisation de l' --add-drop-table et --extended-insert drapeaux.) Cependant, vous devez être sûr que la recherche/remplacer du texte n'allait pas modifier autre chose que les données lui-même (c'est à dire: que le texte que vous alliez à échanger pourrait ne pas se produire comme une partie de la syntaxe SQL) et j'aimerais vraiment essayer de faire la ré-insérer à vide sur un test de la première base de données.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X