unreal4u's Personal Network Because my reality… is just your virtuality

4Ene/11Off

Fallback en MySQL: Actualizar en caso de ya existir

Estos meses he estado bastante ocupado trabajando, y es por lo mismo que no he escrito nada. Sin embargo, he estado atento a sus comentarios y aprobándolos cuando hay.

La solución propuesta hoy me surgió en un momento de extrema ociosidad y flojera, buscando una forma de hacerme la vida más fácil: alguien más tendría que haber tenido la duda de que era posible; en MySQL; insertar un registro, pero si éste registro ya estaba, actualizarlo sin tener que:

  • Hacer la consulta inicial
  • Verificar que exista
  • Actualizar el registro en vez de insertarlo
  • Revisar que se actualizó correctamente

Bueno, esto es posible, y es bastante fácil de implementar. Para saber cómo, siga leyendo :)

La clave está en las palabras reservadas "INSERT ... ON DUPLICATE KEY UPDATE" (disponibles a partir de MySQL 4.1.0) que le indican a MySQL los pasos a seguir en el caso que nuestro insert falló. Supongamos una simple tabla con la siguiente estructura:

CREATE TABLE ejemplo (
  id_ejemplo INT(11) NOT NULL AUTO_INCREMENT,
  descripcion VARCHAR(255) NOT NULL,
  PRIMARY KEY(id_ejemplo)
);

Si deseáramos editar sus registros sin tener conocimiento previo de si está insertado o no pero a la vez manteniendo una sola consulta, se haría de la siguiente forma:

INSERT INTO ejemplo (id_ejemplo,descripcion)
  VALUES (34,'qwerty')
  ON DUPLICATE KEY
    UPDATE descripcion = 'qwerty';

SELECT descripcion FROM ejemplo WHERE id_ejemplo = 34;
-- Esto devuelve: qwerty

INSERT INTO ejemplo (id_ejemplo,descripcion)
  VALUES (34,'asdf')
  ON DUPLICATE KEY
    UPDATE descripcion = 'asdf';

SELECT descripcion FROM ejemplo WHERE id_ejemplo = 34;
-- Esto ahora devuelve: asdf

Así de fácil y así de simple. Por supuesto que aquí lo presento en su forma más básica y explicado con manzanitas, pero se puede complicar bastante, sobretodo considerando llaves únicas compuestas y actualizando varios campos (donde la única diferencia es que tenemos que separar los campos a actualizar con una coma). Para esos casos, por favor remítase a la fuente principal de donde saqué información para este artículo.

Fuente: MySQL.

¿Te gustó este artículo?

¡Considera suscribirte a nuestro feed!

Sobre Camilo Sperberg

Es Ingeniero Informático especializado en Linux y PHP (Es la primera persona en certificarse en PHP5.3 en Chile). En su tiempo libre le gusta estudiar nuevas técnicas de programación y escribir. Además, es amigo de todo ser viviente y cree que la tecnocracia es la mejor forma de política.
Archivado en: Bases de Datos, 2,330 vistas Comments Off
Comentarios (3) Trackbars (5)
  1. No se por que, no he encontrado esto en ningun lado, de haberlo sabido antes me hubiera ahorrado muchos if y else de php para hacer esto…

    Agrego esta nota a mi blog ya que vale la pena…

    Muy buen dato camilo.

  2. chuuuu si hubiera sabido antes me habría ahorrado unas buenas líneas de código en unos objetos de control la semana antes pasada..

    gracias Camilo.

    SAluDOS!!

  3. Impresionante. :)

    Gracias