それがinsert on duplicate key update
するものです です。
そのマニュアルページは
秘訣は、clash
を実行するために、テーブルに一意のキー(複合の場合もある)が必要なことです。 挿入を行うことの検出することができます。そのため、更新はその行で発生し、それ以外の場合は挿入されます。もちろん、主キーにすることもできます。
あなたの場合、
のような複合キーを持つことができますunique key(theName,theDate)
行がすでに存在する場合は、clash
が検出され、更新が行われます。
これが完全な例です
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;
結果を表示
select * from myThing;
+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates |
+----+------+---------+---------+------------+
| 1 | 777 | 1 | 4 | 2015-07-11 |
| 2 | 778 | 1 | 1 | 2015-07-11 |
+----+------+---------+---------+------------+
予想どおり、重複キー更新の挿入は2行だけで機能します。