MySQL, sustituir parte de una cadena

Hoy tuve la imperiosa necesidad de hacer un UPDATE sobre una tabla un poco grande. El UPDATE era algo complicado y afectaba a muchas entradas a la vez, por lo que si salía mal, tenía la posibilidad de armar una buena en todos los datos. La sentencia en cuestión consistía en cambiar una parte del nombre de un campo por otro nombre, pero todo ello sin alterar el correcto funcionamiento de la tabla. Es decir, partimos de algo similar a lo siguiente:
mysql> SELECT * FROM groups;
+---------+-----------------------------+----------+
| groupid | name                        | internal |
+---------+-----------------------------+----------+
|      26 | Pais::Alemania              |        0 |
|      27 | Pais::Andorra               |        0 |
|      28 | Pais::Arabia Saudita        |        0 |
|      29 | Pais::Argentina             |        0 |
|      30 | Pais::Australia             |        0 |
|      31 | Pais::Austria               |        0 |
|      32 | Pais::Azerbaiyan            |        0 |
|      33 | Pais::Bahrein               |        0 |
|      34 | Pais::Belgica               |        0 |
|      35 | Pais::ZZ-Bosnia-herzegovina |        0 |
|      36 | Pais::Brasil                |        0 |
|      37 | Pais::Bulgaria              |        0 |
|      38 | Pais::Canada                |        0 |
|      39 | Pais::Chile                 |        0 |
|      40 | Pais::China                 |        0 |
|      41 | Pais::Chipre                |        0 |
|      42 | Pais::Colombia              |        0 |
|      43 | Pais::Congo                 |        0 |
|      44 | Pais::Corea del Sur         |        0 |
|      45 | Pais::Costa rica            |        0 |
|      46 | Pais::Croacia               |        0 |
|      47 | Pais::Dinamarca             |        0 |
|      48 | Pais::EE.UU.                |        0 |
...
Y la idea es terminar con algo tal que así, cambiando la palabra País por Z.
|      42 | Z::Colombia                 |        0 |
|      43 | Z::Congo                    |        0 |
|      44 | Z::Corea del Sur            |        0 |
|      45 | Z::Costa rica               |        0 |
|      46 | Z::Croacia                  |        0 |
|      47 | Z::Dinamarca                |        0 |
|      48 | Z::EE.UU.                   |        0 |
Para hacer eso desde MySQL se emplear la clausula REPLACE, pero como era la primera vez que la empleaba, no sabía cómo hacer. Así que decidí emplear transacciones, así si algo iba mal, siempre podré deshacer los cambios sin que los datos se vean afectados.
Comencemos pues.
mysql> start transaction;
mysql> UPDATE groups SET name=REPLACE(name,'Pais::','Z::');
Una vez que termina de ejecutarse la sentencia, comprobamos que los cambios son efectivos y correctos, por ejemplo con un SELECT. Si estamos de acuerdo con los mismos, entonces finalizamos la transacción y escribimos los datos.
mysql> commit;
En caso contrario de que algo saliera mal, 'olvidamos' los cambios efectuados con el UPDATE y habría que volver a efectuarlos.
mysql> rollback;
El empleo de transacciones para sentencias no triviales es muy útil, ya que si algo sale mal los cambios no se realizan hasta que se acepten, por lo que no los ponemos en peligro.


No hay comentarios :

Publicar un comentario

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios