MYSQL-如果不存在则插入,但仅在满足条件时更新
我想获得mysql(使用版本8)案例的帮助。 我有下表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)不存在,我想插入一行,但是如果它存在,那
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
将?
占位符替换为要插入的列的值。
谢谢。它起作用了