das ist, was insert on duplicate key update
ist für.
Die Handbuchseite dafür ist hier .
Der Trick besteht darin, dass die Tabelle einen eindeutigen Schlüssel haben muss (kann zusammengesetzt sein), damit der clash
eine Einfügung zu tun, kann erkannt werden. Daher muss die Aktualisierung in dieser Zeile erfolgen, andernfalls eine Einfügung. Es kann natürlich auch ein Primärschlüssel sein.
In Ihrem Fall könnten Sie einen zusammengesetzten Schlüssel wie
habenunique key(theName,theDate)
Wenn die Zeile bereits vorhanden ist, wird der clash
erkannt und die Aktualisierung erfolgt.
Hier ist ein vollständiges Beispiel
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;
Ergebnisse anzeigen
select * from myThing;
+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates |
+----+------+---------+---------+------------+
| 1 | 777 | 1 | 4 | 2015-07-11 |
| 2 | 778 | 1 | 1 | 2015-07-11 |
+----+------+---------+---------+------------+
Wie erwartet funktioniert das Einfügen bei doppelter Schlüsselaktualisierung, nur 2 Zeilen.