仅当表包含值时才更新MySQL
我有一个包含任务的表,这些任务应该在特定的时间执行。对于执行,作业由执行者用其workerID标记。 对于下一个sql:仅当表包含值时才更新MySQL,mysql,database,Mysql,Database,我有一个包含任务的表,这些任务应该在特定的时间执行。对于执行,作业由执行者用其workerID标记。 对于下一个sql: UPDATE table1.jobs SET workerID=10 WHERE workerID IS NULL and time < NOW() ORDER BY time LIMIT 1 我可以标记最古老的未标记作业 现在,我只希望在还没有标记为workerID 10的作业时执行此操作 在一个查询中是否可以执行此操作?您可以将worker\u id设置为唯一键,
UPDATE table1.jobs
SET workerID=10
WHERE workerID IS NULL and time < NOW()
ORDER BY time LIMIT 1
我可以标记最古老的未标记作业
现在,我只希望在还没有标记为workerID 10的作业时执行此操作
在一个查询中是否可以执行此操作?您可以将worker\u id设置为唯一键,然后就完成了。
UPDATE table1.jobs
SET workerID=10
WHERE workerID IS NULL
and time < NOW()
and not exists (select 1 from table1.jobs where workerID=10)
ORDER BY time
LIMIT 1
如果workerID 10已经存在于您的表中,您的更新查询将永远不会执行。在MySQL中,您只能在join子句中提及正在更新的表。因此,您可以将您想要的表达为:
UPDATE table1.jobs j CROSS JOIN
(select count(*) as cnt,
min(case when workerId is null then time end) as min_nulltime
from table1.jobs
where workerId = 10
) j10
SET workerID = 10
WHERE j10.cnt = 0 and j.workerID IS NULL and j.time = j10.min_nulltime
LIMIT 1;
因为在更新中不能将order by与联接一起使用,所以子查询还计算workerId为NULL时的最小时间值。限制仍然存在,只是如果有多行具有相同的最短时间