post icon

Insert or Update [MySQL]

En el día a día laboral cuando trabajamos con bases de datos nos encontramos con tareas repetitivas en donde debemos hacer altas o modificaciones en los registros de nuestras bases de datos, normalmente para decidir que acción llevar a cabo primeramente nos tomamos la molestia de hacer una consulta a la fuente, y verificamos si no existe lo que buscábamos procedemos por el INSERT y si existe UPDATE. Esto podemos hacerlo de manera mucho más eficiente, rápida y con menos código en ambos lados (BD y App) de distintas maneras en las distintas bases de datos del mercado (al menos en las más difundidas MySQL, Firebird, SQL Server [2008], Oracle, etc). En esta entrada lo implementaremos en MySQL aunque espero en los próximos días hacer las entregas de los otros motores.

Ya en éste motor específico tenemos 2 sentencias que nos pueden ayudar con ésta tarea: INSERT ON DUPLICATE KEY UPDATE o también REPLACE. Personalmente siempre opto por la primer opción ya que éste lo que hace por “debajo” es insertar si no existe o actualizar si existe (justo lo que queremos) en cambio la segunda opción inserta si no existe, pero si se da el caso contrario elimina la fila y vuelve a insertar, esto supone un problema si esa fila hace referencia por medio de alguna llave foránea (integridad referencial).

Debemos tener en cuenta siempre que ambos solamente funcionan siempre y cuando exista una llave primaria o un índice único, sino todo sería en vano.

1
2
INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1, b=44;

Como se ve en el ejemplo en el update se puede definir una lista de columna a actualizar. Otros de los factores a tener en cuenta y muy importante esto no se debe utilizar bajo ningún caso sobre un INSERT de multiple filas, ya que el motor reemplazará todas las filas con el valor del primer registro coincidente. Veamos ahora un ejemplo del no recomendado REPLACE.

1
2
3
4
5
6
7
8
REPLACE INTO table (a, b, c)
VALUES (1, 2, 3);
 
REPLACE INTO table (a, b, c)
SET a=1, b=2, c=3;
 
REPLACE INTO table1 (a, b, c)
SELECT d, e, f FROM table2 LIMIT 1;

Comentarios desde Facebook:

Sin Comentarios aun, puedes tú ser el primero en comentar!

Deja tu Comentario

Responder