MYSQL-如果不存在则插入,但仅在满足条件时更新

MYSQL-如果不存在则插入,但仅在满足条件时更新,mysql,Mysql,我想获得mysql(使用版本8)案例的帮助。 我有下表 CREATE TABLE taskStatus (  task_id int NOT NULL,employee_id int NOT NULL, completed_on datetime DEFAULT NULL,task_status bit(1) NOT NULL,  PRIMARY KEY (task_id,employee_id)) ENGINE=InnoDB 如果(任务id,员工id)不存在,我想插入一行,但是如果它存在,那

我想获得mysql(使用版本8)案例的帮助。 我有下表

CREATE TABLE taskStatus (  task_id int NOT NULL,employee_id int NOT NULL, completed_on datetime DEFAULT NULL,task_status bit(1) NOT NULL,  PRIMARY KEY (task_id,employee_id)) ENGINE=InnoDB
如果
(任务id,员工id)
不存在,我想插入一行,但是如果它存在,那么它应该仅在任务状态=0时更新该行。通过这种方式,我希望确保如果有人为一行设置了任务状态=1,则永远不要更改已完成的值。
插入到…。。在重复密钥更新时
将不起作用,因为它不会采用where子句。 对我来说,更新应该只在一个列值满足条件时发生,但是插入可以在没有该条件的情况下发生

我知道我可以使用多个查询来完成这项工作,但我必须对很多行执行这项工作。
我的理解是,如果我可以在一个查询中完成它,那么我就可以批量运行它。如果我在多个查询中执行此操作,则不能作为批处理和 整个过程可能太慢了

有人能提出一些建议吗。

使用如下语句:

INSERT INTO taskStatus(task_id, employee_id, completed_on, task_status) VALUES
(?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
    completed_on = VALUES(completed_on),
    task_status = CASE WHEN task_status THEN task_status ELSE VALUES(task_status) END;
如果
CASE
表达式已经是
1
,它将阻止更新
task\u status
如果您还希望在
任务状态
1
时不更新
completed\u on
,请对其使用类似的
大小写表达式:

completed_on = CASE WHEN task_status THEN completed_on ELSE VALUES(completed_on) END

占位符替换为要插入的列的值。

谢谢。它起作用了