to właśnie insert on duplicate key update
jest dla.
Strona podręcznika do tego znajduje się tutaj .
Sztuczka polega na tym, że tabela musi mieć unikalny klucz (może być złożony), aby clash
wykonania wkładki można wykryć. W związku z tym aktualizacja ma nastąpić w tym wierszu, w przeciwnym razie wstawka. Oczywiście może to być klucz podstawowy.
W twoim przypadku możesz mieć klucz złożony, taki jak
unique key(theName,theDate)
Jeśli wiersz już tam jest, clash
zostanie wykryty i nastąpi aktualizacja.
Oto kompletny przykład
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;
pokaż wyniki
select * from myThing;
+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates |
+----+------+---------+---------+------------+
| 1 | 777 | 1 | 4 | 2015-07-11 |
| 2 | 778 | 1 | 1 | 2015-07-11 |
+----+------+---------+---------+------------+
Zgodnie z oczekiwaniami, wstawianie przy zduplikowanej aktualizacji klucza działa, tylko 2 wiersze.