| Tweet |
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?
Trackbacks are disabled.

Enero 10th, 2011 - 11:53
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.
Enero 11th, 2011 - 03:18
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!!
Marzo 16th, 2011 - 08:21
Impresionante.
Gracias