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
.
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.
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.
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']);
}
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')
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');
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.
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`;
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