Rechercher et remplacer du texte dans la table entière à l'aide D'une requête MySQL

Habituellement, j'utilise la recherche manuelle pour remplacer le texte dans une base de données MySQL en utilisant phpmyadmin. Je suis fatigué de cela maintenant, comment puis-je exécuter une requête pour trouver et remplacer un texte avec un nouveau texte dans la table entière dans phpmyadmin?

Exemple: trouver le mot clé domain.com, remplacer par www.domain.com.

196
demandé sur guaka 2012-08-07 07:59:55

8 réponses

Pour une mise à jour single table

 UPDATE `table_name`
 SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')

À Partir de multiple tables-

Si vous voulez modifier à partir de toutes les tables, le meilleur moyen est de prendre le dump, puis find/replace et télécharger de nouveau.

469
répondu swapnesh 2012-08-07 04:45:43

Le moyen le plus simple que j'ai trouvé est de vider la base de données dans un fichier texte, d'exécuter une commande sed pour effectuer le remplacement et de recharger la base de données dans MySQL.

Toutes les commandes sont bash sur Linux, de la mémoire.

Vider la base de données dans un fichier texte

mysqldump -u user -p databasename > ./db.sql

Exécutez la commande sed pour trouver / remplacer la chaîne cible

sed -i 's/oldString/newString/g' ./db.sql

Rechargez la base de données dans MySQL

mysql -u user -p databasename < ./db.sql

Facile comme bonjour.

27
répondu siliconrockstar 2015-01-19 02:10:50

Mettez ceci dans un fichier php et exécutez-le et il devrait faire ce que vous voulez qu'il fasse.

// Connect to your MySQL database.
$hostname = "localhost";
$username = "db_username";
$password = "db_password";
$database = "db_name";

mysql_connect($hostname, $username, $password);

// The find and replace strings.
$find = "find_this_text";
$replace = "replace_with_this_text";

$loop = mysql_query("
    SELECT
        concat('UPDATE ',table_schema,'.',table_name, ' SET ',column_name, '=replace(',column_name,', ''{$find}'', ''{$replace}'');') AS s
    FROM
        information_schema.columns
    WHERE
        table_schema = '{$database}'")
or die ('Cant loop through dbfields: ' . mysql_error());

while ($query = mysql_fetch_assoc($loop))
{
        mysql_query($query['s']);
}
23
répondu Lee Woodman 2014-03-12 16:58:30

Exécution D'une requête SQL dans PHPmyadmin pour trouver et remplacer du texte dans tous les messages de blog wordpress, tels que la recherche mysite.com/wordpress et en remplaçant cela par mysite.com/news La Table dans cet exemple est tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
20
répondu guest 2014-02-19 02:44:03
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Comme par exemple, si je veux remplacer toutes les occurrences de Jean-Marc, je vais utiliser ci-dessous,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
8
répondu Umesh Patil 2014-07-08 11:11:44

Une autre option consiste à générer les instructions pour chaque colonne de la base de données:

SELECT CONCAT(
    'update ', table_name , 
    ' set ', column_name, ' = replace(', column_name,', ''www.oldDomain.com'', ''www.newDomain.com'');'
) AS statement
FROM information_schema.columns
WHERE table_schema = 'mySchema' AND table_name LIKE 'yourPrefix_%';

Cela devrait générer une liste d'instructions de mise à jour que vous pouvez ensuite exécuter.

6
répondu Farid.O 2017-03-20 09:47:38

Je crois que la réponse "swapnesh" est la meilleure ! Malheureusement, je ne pouvais pas l'exécuter dans phpMyAdmin (4.5.0.2) qui, bien qu'illogique (et essayé plusieurs choses), disait qu'une nouvelle instruction était trouvée et qu'aucun délimiteur n'était trouvé ...

Ainsi, je suis venu avec la solution suivante qui pourrait être utile si vous exeprience le même problème et n'avez pas d'autre accès à la base de données que PMA ...

UPDATE `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid` 
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
SET `toUpdate`.`guid`=`updated`.`guid`
WHERE `toUpdate`.`ID`=`updated`.`ID`;

Pour tester le résultat escompté vous pouvez utiliser :

SELECT `toUpdate`.`guid` AS `old guid`,`updated`.`guid` AS `new guid`
FROM `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
WHERE `toUpdate`.`ID`=`updated`.`ID`;
2
répondu llange 2015-10-26 12:25:35

Générer des requêtes SQL de changement (rapide)

Mysql-e " SELECT CONCAT ('update', table_name, ' set ', column_name, '= replace ( ' , column_name,', "www.oldsite.com", "www.newsite.com");') comme déclaration de information_schema.colonnes où table_name comme 'wp_% '" - u root-p your_db_name_here > upgrade_script.sql

Supprimez toutes les ordures au début du fichier. J'ai eu quelques.

NANO upgrade_script.sql

Exécutez le script généré avec les options --force pour ignorer les erreurs. (Lent-prenez un café si grand DB)

Mysql-u root-p your_db_name_here --force

0
répondu Andy 2017-11-03 17:44:25