Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当表包含值时才更新MySQL_Mysql_Database - Fatal编程技术网

仅当表包含值时才更新MySQL

仅当表包含值时才更新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设置为唯一键,

我有一个包含任务的表,这些任务应该在特定的时间执行。对于执行,作业由执行者用其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() 
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时的最小时间值。限制仍然存在,只是如果有多行具有相同的最短时间