é isso que
insert on duplicate key update
é para. A página do Manual está aqui .
O truque é que a tabela precisa ter uma chave única (pode ser uma composição) para que o
clash
de fazer uma inserção pode ser detectado. Como tal, a atualização deve ocorrer nessa linha, caso contrário, uma inserção. Pode ser uma chave primária, é claro. No seu caso, você pode ter uma chave composta como
unique key(theName,theDate)
Se a linha já estiver lá, o
clash
é detectado e a atualização acontece. Aqui está um exemplo 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 esperado, inserir na atualização de chave duplicada funciona, apenas 2 linhas.