martes, 28 de julio de 2015

Actualizar diferentes filas con una sola consulta en MySQL

Hace poco tiempo tuve la necesidad de actualizar varios registros a la vez, lo mas sencillo es crear una consulta y repetirla n veces de acuerdo a la cantidad de registros que deseo actualizar, he aquí la solución sencilla:

UPDATE Directorio SET Orden = 1 WHERE DirectorioId = 1021;
// Ejecutarla
UPDATE Directorio SET Orden = 0 WHERE DirectorioId = 1022;
// Ejecutarla
UPDATE Directorio SET Orden = 2 WHERE DirectorioId = 1023;
// Ejecutarla

Esto funcionaria sin problemas, sin embargo al tener mas registros esto consumiría demasiados recursos de nuestro servidor porque se ejecutarían n sentencias, la opción es simplificar todo a una sola consulta usando CASE, WHEN y THEN. A continuación como quedaría nuestra consulta:

UPDATE Directorio
   SET Orden = CASE DirectorioId
      WHEN 1021 THEN 1
      WHEN 1022 THEN 0
      WHEN 1023 THEN 2
   END
WHERE DirectorioId IN (1021, 1022, 1023) 

De esta forma nuestro servidor ejecutara una sola consulta. En este caso que vimos solo actualizamos un campo pero también es posible actualizar varios campos a la vez, he aquí el ejemplo:

UPDATE Directorio
    SET Orden = CASE DirectorioId
        WHEN 1021 THEN 1
        WHEN 1022 THEN 0
        WHEN 1023 THEN 3
    END,
    SET DepartamentoId = CASE DirectorioId
        WHEN 10 THEN 11
        WHEN 12 THEN 21
        WHEN 13 THEN 11
    END
WHERE DirectorioId IN (1021, 1022, 1023)

Ahora solo un poco de ingenio para incluirlo en nuestro código PHP ya sea con sentencias de control FOR, DO o While. Espero haya sido de utilidad este post.

Entradas Populares