Buscar y reemplazar texto en toda la tabla usando una consulta MySQL


Normalmente uso búsqueda manual para reemplazar texto en una base de datos MySQL usando phpmyadmin. Estoy cansado de esto ahora, ¿cómo puedo ejecutar una consulta para encontrar y reemplazar un texto con texto nuevo en toda la tabla en phpmyadmin?

Ejemplo: buscar palabra clave domain.com, reemplazar con www.domain.com.

Author: guaka, 2012-08-07

8 answers

Para una actualización single table

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

De multiple tables -

Si desea editar desde todas las tablas, la mejor manera es tomar el dump y luego find/replace y subirlo de nuevo.

 469
Author: swapnesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-07 04:45:43

La forma más fácil que he encontrado es volcar la base de datos a un archivo de texto, ejecutar un comando sed para hacer el reemplazo, y volver a cargar la base de datos en MySQL.

Todos los comandos son bash en Linux, de memoria.

Volcar la base de datos a un archivo de texto

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

Ejecute el comando sed para buscar/reemplazar la cadena de destino

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

Recargar la base de datos en MySQL

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

Pan comido.

 27
Author: siliconrockstar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-19 02:10:50

Pon esto en un archivo php y ejecútalo y debería hacer lo que quieras que haga.

// 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
Author: Lee Woodman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-12 16:58:30

Ejecutar una consulta SQL en phpMyAdmin para buscar y reemplazar texto en todas las publicaciones de blog de wordpress, como buscar mysite.com/wordpress y reemplazando eso con mysite.com/news La tabla en este ejemplo es tj_posts

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
 20
Author: guest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-19 02:44:03
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Como por ejemplo, si quiero reemplazar todas las apariciones de Juan por Marcos voy a utilizar a continuación,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
 8
Author: Umesh Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-08 11:11:44

Otra opción es generar las sentencias para cada columna en la base de datos:

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_%';

Esto debería generar una lista de instrucciones update que luego puede ejecutar.

 6
Author: Farid.O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 09:47:38

Creo que la respuesta de "swapnesh" es la mejor ! Desafortunadamente no pude ejecutarlo en phpMyAdmin (4.5.0.2) quien aunque ilógico (e intentó varias cosas) seguía diciendo que se encontró una nueva declaración y que no se encontró delimitador {

Así que vine con la siguiente solución que podría ser útil si exeprience el mismo problema y no tienen otro acceso a la base de datos 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`;

Para probar el resultado esperado puede usar:

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
Author: llange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-26 12:25:35

Generar consultas SQL de cambio (RÁPIDO)

Mysql-e " SELECT CONCAT ('update', table_name, 'set', column_name,' = replace (', column_name,', "www.oldsite.com", "www.newsite.com");') COMO declaración DE information_schema.columnas DONDE table_name COMO ' wp_%' " - u root-p su_db_name_here > upgrade_script.sql

Elimine cualquier elemento no deseado al inicio del archivo. Tomé un poco.

Nano upgrade_script.sql

Ejecute el script generado con las opciones force force para omitir errores. (LENTO-tomar un café si es grande DB)

Mysql-u root-p your_db_name_here force force

 0
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 17:44:25