Mysql 插入到或使用两个条件更新

Mysql 插入到或使用两个条件更新,mysql,sql,Mysql,Sql,乍一看,这个问题似乎很容易,但我根本没有找到一个合理的解决方案 考虑具有以下特征的表格: ID INTEGER PRIMARY KEY AUTOINCREMENT name INTEGER values1 INTEGER values2 INTEGER dates DATE 每天都会生成N个新行,用于将来的日期,并且“名称”来自有限的列表。我想在有新数据时插入一个新行,但如果已经有一行带有“name”和“dates”,只需更新它即可 请注意,检查条件的存储过程的当前建议解决方案不可行,因为这是

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

考虑具有以下特征的表格:

ID INTEGER PRIMARY KEY AUTOINCREMENT
name INTEGER
values1 INTEGER
values2 INTEGER
dates DATE
每天都会生成N个新行,用于将来的日期,并且“名称”来自有限的列表。我想在有新数据时插入一个新行,但如果已经有一行带有“name”和“dates”,只需更新它即可


请注意,检查条件的存储过程的当前建议解决方案不可行,因为这是从另一种语言推送的数据。

这就是重复密钥更新时插入的
的目的

它的手册页是

诀窍在于,表需要有一个唯一的键(可以是复合键),以便可以检测到执行插入操作时的
冲突。因此,更新将发生在该行上,否则为插入。当然,它可以是主键

在您的情况下,您可以有一个复合键,例如

unique key(theName,theDate)
如果行已经存在,则检测到
碰撞
,并进行更新

这是一个完整的例子 正如预期的那样,插入重复密钥更新工作,只需2行。

这很容易:

  • 在要检查的列上创建唯一键
  • 使用插入。。关于重复密钥更新构造
可能的副本
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 |
+----+------+---------+---------+------------+