我有一个包含任务的表,应该在某个时间执行。为了执行,作业由执行者以其workerID标记。 用下一个sql:
UPDATE table1.jobs
SET workerID=10
WHERE workerID IS NULL and time < NOW()
ORDER BY time LIMIT 1
我可以标记最旧的未标记作业。
现在我希望只有在没有标有workerID 10的作业时才执行此操作。
这可能在一个查询中吗?
答案 0 :(得分:0)
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
答案 1 :(得分:0)
你可以worker_id as Unique key
完成。
如果您的表中已存在workerID 10,则UPDATE查询将永远不会执行。
答案 2 :(得分:0)
在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
中使用join
update
,因此当time
为NULL时,子查询还会计算workerId
的最小值。 limit
仍然存在,只是存在多个具有相同最小时间的行。