sql >> Base de Datos >  >> RDS >> Mysql

INSERTAR EN o ACTUALIZAR con dos condiciones

eso es lo que insert on duplicate key update es para.

La página del Manual para ello está aquí .

El truco es que la tabla necesita tener una clave única (puede ser un compuesto) para que el clash de hacer una inserción puede ser detectado. Como tal, la actualización se producirá en esa fila, de lo contrario, una inserción. Puede ser una clave principal, por supuesto.

En su caso, podría tener una clave compuesta como

unique key(theName,theDate)

Si la fila ya está ahí, el clash se detecta y se produce la actualización.

Aquí hay un ejemplo completo

create table myThing
(   id int auto_increment primary key,
    name int not null,
    values1 int not null,
    values2 int not null,
    dates date not null,
    unique key(name,dates) -- <---- this line here is darn important
);

insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;
insert myThing(name,values1,values2,dates) values (778,1,1,'2015-07-11') on duplicate key update values2=values2+1;
-- do the 1st one a few more times:
insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;
insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;
insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;

mostrar resultados

select * from myThing;
+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates      |
+----+------+---------+---------+------------+
|  1 |  777 |       1 |       4 | 2015-07-11 |
|  2 |  778 |       1 |       1 | 2015-07-11 |
+----+------+---------+---------+------------+

Como era de esperar, la inserción en la actualización de clave duplicada funciona, solo 2 filas.