det er hvad insert on duplicate key update
er til.
Manual-siden til det er her .
Tricket er, at tabellen skal have en unik nøgle (kan være en sammensat), så clash
at lave en indsættelse kan detekteres. Som sådan skal opdateringen ske på den række, ellers en indsættelse. Det kan selvfølgelig være en primær nøgle.
I dit tilfælde kunne du have en sammensat nøgle såsom
unique key(theName,theDate)
Hvis rækken allerede er der, vises clash
registreres, og opdateringen sker.
Her er et komplet eksempel
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;
vis resultater
select * from myThing;
+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates |
+----+------+---------+---------+------------+
| 1 | 777 | 1 | 4 | 2015-07-11 |
| 2 | 778 | 1 | 1 | 2015-07-11 |
+----+------+---------+---------+------------+
Som forventet, indsæt på dublet nøgleopdatering virker, kun 2 rækker.