Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Reducir varios updates

Estas en el tema de Reducir varios updates en el foro de Mysql en Foros del Web. Tengo el siguiente caso. Debo hacer un update a un campo, según una determinada condición. Es decir: Código PHP: UPDATE tabla       SET valor  =  'A'        WHERE id  ...
  #1 (permalink)  
Antiguo 06/02/2009, 07:42
 
Fecha de Ingreso: junio-2008
Mensajes: 71
Antigüedad: 15 años, 9 meses
Puntos: 0
Reducir varios updates

Tengo el siguiente caso.

Debo hacer un update a un campo, según una determinada condición. Es decir:

Código PHP:
UPDATE tabla
      SET valor 
'A'
      
WHERE id '1' 
Pero varias veces, es decir: valor = 'A' y id = '1', valor = 'B' y id = '2',..., valor = 'ZEFD' y id = '623641'

Esta situación me ha ocurrido mucho, pero no me ha importado, salvo hoy que me toca hacerlo hasta miles de veces. El método para estos casos es repetir el UPDATE para cada caso, pero como el resultado son miles de UPDATE pensar en eso me recuerda a este smile

¿habrá una forma mejor?

Pensé en la opción de usar REPLACE, pero de esta forma se pierde la data de los otros campos y parece que no tiene remedio, además que no estoy seguro si pase algo loco con algún campo que sea autoincrement.

Gracias adelantadas.
  #2 (permalink)  
Antiguo 06/02/2009, 08:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Reducir varios updates

Si tienes los miles de pares de cambios en una tabla luego puedes hacer lo siguiente

UPDATE Tabla1 LEFT JOIN TABLA2 ON Tabla1.id = tabla2.Id
SET Tabla1.valor = Tabla2.valor;


Tabla2
valor::::id
A:::::::::1
B:::::::::2
...
ZEFD::::623641

Si?

Quim
  #3 (permalink)  
Antiguo 06/02/2009, 08:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Reducir varios updates

no sé si yo habré entendido mal, pero con esta sintaxis un case dentro de un set podrías hacerlo, eso sí no dejando de poner el ELSE final para evitar que se pierdan los datos de los campos donde no se produzca coincidencia. Imaginemos que tienes dos campos numero1 y numero2 y quieres que cuando el numero1 sea 1 el número2 sea 10, y cuando sea el numero1 2, el numero 2 sea 20, y que no cambie los demás...

UPDATE tabla SET valor=CASE WHEN id = 1 THEN 'A' WHEN id = 2 THEN 'B' WHEN id = 623641 THEN 'ZEFD' ELSE valor END

Seguro que hay soluciones más sencillas. Por cierto, no entiendo bien lo que dices acerca del problema que te produce REPLACE.

Última edición por jurena; 06/02/2009 a las 12:50
  #4 (permalink)  
Antiguo 06/02/2009, 13:21
 
Fecha de Ingreso: junio-2008
Mensajes: 71
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Reducir varios updates

Cita:
Iniciado por quimfv Ver Mensaje
Si tienes los miles de pares de cambios en una tabla luego puedes hacer lo siguiente

UPDATE Tabla1 LEFT JOIN TABLA2 ON Tabla1.id = tabla2.Id
SET Tabla1.valor = Tabla2.valor;


Tabla2
valor::::id
A:::::::::1
B:::::::::2
...
ZEFD::::623641

Si?

Quim
Gracias, se ve interesante e ingenioso. Primero haría el insert a una tabla "C", luego el update y luego vaciado de la otra tabla. En tres tiros estaría muerto el problema .

Cita:
Iniciado por jurena Ver Mensaje
no sé si yo habré entendido mal, pero con esta sintaxis un case dentro de un set podrías hacerlo, eso sí no dejando de poner el ELSE final para evitar que se pierdan los datos de los campos donde no se produzca coincidencia. Imaginemos que tienes dos campos numero1 y numero2 y quieres que cuando el numero1 sea 1 el número2 sea 10, y cuando sea el numero1 2, el numero 2 sea 20, y que no cambie los demás...

UPDATE tabla SET valor=CASE WHEN id = 1 THEN 'A' WHEN id = 2 THEN 'B' WHEN id = 623641 THEN 'ZEFD' ELSE valor END

Seguro que hay soluciones más sencillas. Por cierto, no entiendo bien lo que dices acerca del problema que te produce REPLACE.
Muchas gracias de nuevo, me parece que si has entendido bien y esto también puede servir.

Lo del REPLACE es que tengo entendido que si ya existe una entrada con el mismo key primary o unique, lo borra y lo reescribe de nuevo.

Entonces si mi tabla tiene más columnas además de ID y de valor, entonces los pierdo ya que se "insertarán" sin valor y tomará el valor defult, o tengo que leerlos previamente para también introducirlos en el REPLACE.

Y aquello de "que si hay columnas con un autoincrement..." viene de lo mismo, estarían cambiando esos id orque se incrementarían.

PD: ¿y hay más sencillas? no dejo de sorprenderme en este foro

PD2: jurena al parecer el foro ya no me deja darte más karma son muchas varias las veces que me has ayudado.

-----------------------------------------------------------------------------------------

Por cosas que tiene la vida, tengo que dejar mis asuntos desde hoy y un par de semanas, en otras palabras no pasaré a probarlas, esa será tarea que retomaré luego, pero desde hoy les agradezco por su ayuda además que sus soluciones lucen bien en teoría y me parece que sea la que sea funcionará a la perfección a lo que quería.

Muchas gracias una vez más.
  #5 (permalink)  
Antiguo 06/02/2009, 13:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Reducir varios updates

Gracias, Sebassebas.
A mí también me gusta más la de Quim. Sólo tendrías que generar una tabla temporal e insertar los datos, y posteriormente mediante el inner join hacer el update: maravilloso. Estas son las cosas de Quim. Y por el karma no te preocupes, tus amables palabras son el mejor karma.
Saludos y espero que todo vaya bien.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:55.