INSERT INTO或UPDATE有两个条件

时间:2015-09-08 22:51:23

标签: mysql sql

这个问题乍一看似乎很容易,但我根本没有找到合理时间的解决方案。

考虑一个具有以下特征的表:

ID INTEGER PRIMARY KEY AUTOINCREMENT
name INTEGER
values1 INTEGER
values2 INTEGER
dates DATE

每天都会生成N个新行,以及将来的日期,以及' name'来自有限的名单。我想在有新数据的情况下插入一个新行,但是如果已经有一行有' name'和'日期',只需更新它。

请注意,目前提出的检查条件的SPROC解决方案是不可行的,因为这是从另一种语言推送的数据。

2 个答案:

答案 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)

这很简单:

  • 在要检查的列上创建唯一键
  • 使用INSERT .. ON DUPLICATE KEY UPDATE构造