仅当表包含值时,才更新MySQL

时间:2015-04-20 11:30:56

标签: mysql database

我有一个包含任务的表,应该在某个时间执行。为了执行,作业由执行者以其workerID标记。 用下一个sql:

UPDATE table1.jobs
SET workerID=10
WHERE workerID IS NULL and time < NOW()
ORDER BY time LIMIT 1

我可以标记最旧的未标记作业。

现在我希望只有在没有标有workerID 10的作业时才执行此操作。

这可能在一个查询中吗?

3 个答案:

答案 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仍然存在,只是存在多个具有相同最小时间的行。