首页 > 解决方案 > Mysql 如果不可用则插入,如果部分可用则更新,如果完全可用则退出

问题描述

我需要根据是否找到、部分找到或根本不可用这些值来采取适当的措施。

这是我的桌子:

id. emp_code. ot_date. ot_hours
 1 123      2021-05-01 3
 2 567      2021-05-01 1

现在我有这3个数据:

数据 #1 emp_code:123 ot_date:2021-05-01 ot_hours:3

数据 #2 emp_code:123 ot_date:2021-05-02 ot_hours:3

数据 #3 emp_code:567 ot_date:2021-05-01 ot_hours:2.5

这是我决定和采取行动的逻辑:

 select emp_code, ot_date where values are (emp_code, ot_date)
 from ot_forecast
 if it exist
 select emp_code, ot_dat,ot_hours where values are (emp_code, ot_date, ot_hours)
 from ot_forecast
 if exist then exit
 else update values (emp_code, ot_date, ot_hours)
 else insert values (emp_code, ot_date, ot_hours)

根据我的逻辑,数据1将被跳过,数据2将被插入,数据3将被更新

问题是,我无法弄清楚如何将其放入代码中。我已经卡在第一行了。

希望有人可以指导我。谢谢

标签: mysql

解决方案


如果您创建emp_code,ot_date作为唯一(或主(id似乎毫无意义))键,则启用INSERT ON DUPLICATE KEY UPDATE

CREATE UNIQUE INDEX ot_forecast ( emp_code, ot_date)

您的查询将变为:

INSERT INTO ot_forecast
SET emp_code = xxx, ot_date= yyyy, ot_hours = zzzz
ON DUPLICATE KEY UPDATE ot_hours = zzzz

您作为选择的第一个案例将导致更新,也许这没关系,因为它实际上是一个无操作。

如果你在哪里使用 MariaDB,你也可以使用INSERT RETURNING

INSERT INTO ot_forecast
SET emp_code = xxx, ot_date= yyyy, ot_hours = zzzz
ON DUPLICATE KEY UPDATE ot_hours = zzzz
RETURNING emp_code, ot_date, ot_hours

推荐阅读