2010-06-29 26 views
9

necesito reemplazar algunos caracteres en las columnas de una tabla, utilizando el comando REPLACE.
Sé que el comando REPLACE necesita un nombre de columna, luego el texto para cambiar (en el siguiente ejemplo, el carácter "a") y el nuevo texto (en el siguiente caso, el carácter "e").Reemplazar todos los campos en MySQL

UPDATE my_table SET my_column = REPLACE (my_column,'a','e'); 

Para que la ejecución de este comando cambiará todas las ocurrencias 'un' en la columna de la my_column de la mesa con el my_table 'e' Char.

Pero lo que si tengo que ejecutar el comando REPLACE para cada columna y no sólo para uno? es posible?

Gracias

+0

dba.stackexchange.com/questions/21147/query-to-find-and-replace-text-in-all-tables-and-fields-of-a-mysql- db – Foreever

Respuesta

8

Utilice la siguiente consulta SQL para generar las consultas SQL que necesita para reemplazar un valor en todas las columnas.

select concat(
     'UPDATE my_table SET ', 
     column_name, 
     ' = REPLACE(', column_name, ', ''a'', ''e'');') 
from information_schema.columns 
where table_name = 'my_table'; 

Después de ejecutar esta consulta SQL, simplemente ejecute todas las consultas para reemplazar todos los valores.


No comprobado después de algún googlear

crear un procedimiento almacenado con un núcleo de esta manera. Puede aceptar el nombre de la tabla, el valor para encontrar y el valor para reemplazar.

La idea principal es utilizar:

  1. declaraciones preparadas para la ejecución de SQL dinámico;
  2. cursores para iterar sobre todas las columnas de una tabla.

Ver código parcial (no probado) a continuación.

DECLARE done INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR 
    SELECT column_name FROM information_schema.columns 
    WHERE table_name = 'my_table'; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 
REPEAT 
    SET s = concat(
     'UPDATE my_table SET ', 
     column_name, 
     ' = REPLACE(', column_name, ', ''a'', ''e'');'); 
    PREPARE stmt2 FROM s; 
    EXECUTE stmt2; 
    FETCH cur1 INTO a; 
UNTIL done END REPEAT; 
CLOSE cur1; 
+0

Deberá verificar en DÓNDE para asegurarse de que está intentando ejecutar el reemplazo de texto solo en las columnas que usan tipos de datos basados ​​en texto;). Y esto podría hacerse usando las declaraciones preparadas de MySQL (SQL dinámico) ... –

+0

No dude en editar mi respuesta @OMG Ponies –

+0

Creo, pero tal vez estoy equivocado, que la consulta sugerida necesita una coma más en la posición (4, 36). Ahora genera UPDATE my_table SET my_column = REPLACE (my_column'ù ',' ù '); en lugar de ACTUALIZACIÓN my_table SET my_column = REPLACE (my_column, 'ù', 'ù'); – Mark

0

No puede hacer lo que quiera. Si fuera yo, tomaría una lista de nombres de columna y en mi editor haré una búsqueda rápida de expresiones regulares y la reemplazaré.

Find: (.+)

Replace: UPDATE my_table SET \1 = REPLACE (\1,'a','e');

5

di un pequeño cambio:

select concat(
    'UPDATE ', table_name, ' SET ', 
    column_name, 
    ' = REPLACE(', column_name, ', ''OLDTEXT'', ''NEWTEXT'');') 
from information_schema.columns 
where table_name = 'TABLENAME'; 

que utilizará la variable de TABLENAME (sólo un poco menos de mecanografía) - por lo que sólo necesita reemplazar el material de las tapas.

Además, no entendí al principio, pero esto solo dará como resultado salida una lista de consultas SQL que luego deberá ejecutar para reemplazar realmente el código. Espero que esto ayude ...

1

Esto va a hacer el truco con un poco de PHP MySQL desde PHP a menudo incluye cosas. probado y trabajando :)

<?php 

     $host = 'localhost'; 
     $user = 'root'; 
     $pass = 'yourpass'; 
     $db = 'your_database_name'; 

     $connection = mysql_connect($host, $user, $pass); 
     mysql_select_db($db); 

     $thisword = "this one should be"; 
     $shouldbe = "like this"; 
     $thistable = "your_table_name"; 

     MySQL_replace_all($thisword, $shouldbe, $thistable); 

     function MySQL_replace_all($thisword,$shouldbe,$thistable){ 
      $cnamnes = "SHOW columns FROM " . $thistable; 
      $result = mysql_query($cnamnes); 
      while($columnname = mysql_fetch_row($result)){ 
       $replace_SQL = "UPDATE $thistable SET ". $columnname[0] ." = REPLACE(". $columnname[0] .",'". $thisword ."', '". $shouldbe ."');"; 
       echo $replace_SQL . "<br>"; 
       mysql_query($replace_SQL); 
      } 
    } 

?> 
+0

Voto mayoritario por un par de razones. Primero, si bien es probable que exista alguna forma enrevesada de hacer esto, todavía has logrado publicar algo que * WILL * funcionará. En segundo lugar, se tomó la molestia de proporcionar un archivo PHP completo para hacer esto, que es útil para los que acaban de comenzar. – John

+0

¡Gracias! Buena música en su página web :) Track 04 .. –

+0

@carl_lingberg De nada, lista de reproducción 2.8? Si es así, hice esa canción. – John

Cuestiones relacionadas