2011-01-27 26 views
43

me gustaría hacer un buscar y reemplazar dentro de una base de datos completa no solo una tabla.Buscar y reemplazar en toda la base de datos mysql

¿Cómo puedo alterar el script a continuación para que funcione?

actualización [nombre_tabla] ajustado [nombre_campo] = replace ([nombre_campo], '[string_to_find]', '[string_to_replace]');

¿Acabo de utilizar un asterisco?

actualización * establece [nombre_campo] = replace ([nombre_campo], '[string_to_find]', '[string_to_replace]');

+1

no estoy seguro de si MySQL permite eso, pero sería altamente dudar de sí que parece una gran tormenta de fuego de seguridad a punto de ocurrir. –

+0

jeje bien, el problema es que no sé qué tabla tiene la información y hay una mierda de tablas. – Andy

+0

Para saber qué tablas tienen los datos, puede ejecutar una búsqueda de base de datos completa que le mostrará qué tablas tienen datos que coinciden con sus criterios de búsqueda. En phpmyadmin, vaya también /phpmyadmin/db_search.php –

Respuesta

104

sqldump a un archivo de texto, buscar/reemplazar, volver a importar el sqldump.

volcar la base de datos a un archivo de texto
mysqldump -u root -p[root_password] [database_name] > dumpfilename.sql

Restaurar la base de datos después de haber realizado cambios en él.
mysql -u root -p[root_password] [database_name] < dumpfilename.sql

+0

oh buena idea .... – Andy

+7

yup, esto funcionó para mí también. Puedo agregar los comandos para hacer eso aquí: copia de seguridad: # mysqldump -u root -p [contraseña_raíz] [nombre_base_datos]> nombre_archivo_dúplex.sql restauración : # mysql -u raíz -p [contraseña_raíz] [nombre_base_datos] ... también, no hay espacio entre la -p y la contraseña – DextrousDave

+0

+1 Rápida y sucia. Me gusta :-) – everton

4

Respuesta corta: No se puede.

Respuesta larga: Puede usar el INFORMATION_SCHEMA para obtener las definiciones de tabla y usar esto para generar las sentencias de ACTUALIZACIÓN necesarias dinámicamente. Por ejemplo, podría comenzar con esto:

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

Intentaré evitar hacer esto aunque sea posible.

+1

Ok eso es todo eso :) – Andy

2

Esto no es posible; debe realizar una ACTUALIZACIÓN para cada tabla individualmente.

ADVERTENCIA: DUDOSA, pero que va a trabajar (probablemente) SOLUCIÓN SIGUIENTE

Como alternativa, puede volcar la base de datos a través de mysqldump y simplemente realizar la búsqueda/reemplazo en el archivo SQL resultante. (Recomendaría dejar todo lo que pueda tocar la base de datos mientras está en progreso, así como usar los parámetros --add-drop-table y --extended-insert.) Sin embargo, necesitaría estar seguro de que el buscar/reemplazar texto no iba a alterar nada más que los datos en sí (es decir, que el texto que se iba a intercambiar podría no ocurrir como parte de la sintaxis de SQL) y Realmente intentaría hacer la reinserción en una base de datos de prueba vacía primero.)

+0

Gracias Midda, ¡un buen consejo! – Andy

6

Esto implica fuertemente que sus datos no se normaliza para empezar. Realmente deberías arreglar eso.

Somteh = cosa como esto debería funcionar (NB no se ha mencionado de su uso de cualquier otro idioma - por lo que su escrito como un procedimiento almacenado de 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 // 

Lo dejo a usted para trabajar cómo declarar la función word_sub: he hecho suficiente programación gratuita aquí.

+0

lo que sea, no existe una regla escrita que su base de datos DEBE ser normalizada. La normalización tiene su lugar, pero si a menudo compite con el rendimiento. –

+1

'programación gratuita suficiente' en un sitio de preguntas y respuestas –

26

actualización URL antigua a la nueva URL de palabra-prensa consulta MySQL:

UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com') WHERE option_name = 'home' OR option_name = 'siteurl'; 

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

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

UPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com'); 
+2

No olvide la columna _post_excerpt_ en la tabla _wp_posts_: 'UPDATE wp_posts SET post_excerpt = replace (post_excerpt, 'http://olddomain.com', 'http: //newdomain.com '); ' –

1

Soltion simple

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

Sí, pero eso funciona solo para una columna. –

2

MySQL Search & Replace Tool

herramienta basada en web muy útil escrito en PHP que lo hace fácil de buscar y reemplazar cadenas de texto en una base de datos MySQL.

+1

El enlace ya no funciona –

0

Otra opción (según el caso de uso) sería utilizar los productos TextPipe y DataPipe de DataMystic. Los he usado en el pasado, y han funcionado muy bien en los complejos escenarios de reemplazo, y sin tener que exportar datos de la base de datos para buscar y reemplazar.

0

Solo quería compartir cómo hice esta función de buscar/reemplazar con la base de datos sql, porque necesitaba reemplazar los enlaces del archivo sessionbuddy db de Chrome.

  • Así que exporta el archivo de base de datos SQL como archivo .txt utilizando SQLite Browser base de datos 2.0 b1
  • buscar/reemplazar en Notepad ++
  • importado el archivo .txt de nuevo en SQLite Database Browser 2.0 b1
1

¡TEN CUIDADO, al reemplazar con el comando REEMPLAZAR!

¿por qué?

porque hay una gran posibilidad de que su base de datos contenga datos serializados (especialmente tabla wp_options), por lo que el uso de "reemplazar" podría romper los datos.

Uso serialización recomendada: https://www.protectpages.com/tools/WordpressMigrator

+2

Nunca es una palabra muy fuerte. No todos tienen una base de datos de Wordpress. Si construiste tu propia base de datos, ya sabrás si hay artículos serializados o no. Obviamente, si tiene elementos serializados, o no sabe si hay artículos serializados, debe seguir este consejo, pero esa no es una situación de "nunca". – starshine531

+0

su consejo es aceptado. respuesta editada;) –

+0

No es realmente una mala respuesta, me salvaste un poco de dolor de cabeza. – codinginsane