这个问题乍一看似乎很容易,但我根本没有找到合理时间的解决方案。
考虑一个具有以下特征的表:
ID INTEGER PRIMARY KEY AUTOINCREMENT
name INTEGER
values1 INTEGER
values2 INTEGER
dates DATE
每天都会生成N个新行,以及将来的日期,以及' name'来自有限的名单。我想在有新数据的情况下插入一个新行,但是如果已经有一行有' name'和'日期',只需更新它。
请注意,目前提出的检查条件的SPROC解决方案是不可行的,因为这是从另一种语言推送的数据。
答案 0 :(得分:7)
这就是insert on duplicate key update
的用途。
手册页面为here。
技巧是表需要一个唯一的键(可以是复合键),以便可以检测到执行插入的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行。
答案 1 :(得分:2)
这很简单: