我正在尝试对UPDATE
行进行查询(如果存在),否则更新另一行。我只希望每次执行查询时都更新一行。第二个WHERE
用于查询的第一部分没有返回的情况。
我希望更新一个默认值为'null'
的单个属性。正如我在其他帖子(e.g.)中所见,没有使用公钥的方法。
我可以用UNION
返回所需的元组,但是随后无法根据需要将表达式转换为UPDATE
查询:
(SELECT * FROM table
WHERE (foo BETWEEN x-c AND x+c) AND (bar ..) AND column='null' LIMIT 1)
UNION
(SELECT * FROM table
WHERE column='null' LIMIT 1)
LIMIT 1;
这似乎总是返回第一个WHERE
,如果存在第二个WHERE
的话。
尝试基于计数变量设计IF-ELSE时,我一直收到语法错误:
SET @count=(SELECT COUNT(*) FROM table
WHERE (foo BETWEEN x-c AND x+c) AND (bar ..) AND column='null' LIMIT 1);
IF @count THEN
(UPDATE table SET column='foobar'
WHERE (foo BETWEEN x-c AND x+c) AND (bar ..) AND column='null' LIMIT 1);
ELSE
(UPDATE table SET column='foobar'
WHERE column='null' LIMIT 1);
END IF;
我也尝试构造一个子查询,但是没有运气来获得想要的行为。
我担心使用计数可能会导致比赛条件的机会?我不确定是否有更好的方法。
非常感谢您的帮助!
答案 0 :(得分:2)
如果我理解正确,则可以只使用order by
和limit
:
update table
set . . .
where column = 'null'
order by ((foo) AND (bar)) desc
limit 1;
desc
将把符合两个条件的行放在第一位。然后将跟随其他行。 limit
选择第一个匹配项。
我认为我更倾向于分别订购这两个条件:
order by (foo) desc, (bar) desc
答案 1 :(得分:0)
像这样?我不能保证很快:
update <table>
where
column is null and <foo> and <bar>
or not (<foo> and <bar>) and not exists (
select 1 from <table> where column is null and <foo> and <bar>
);
答案 2 :(得分:0)
这是一种方法。运行第一个UPDATE。运行之后,函数ROW_COUNT()
将返回0或1,具体取决于第一个UPDATE是否影响任何行。
在第二个UPDATE中,如果ROW_COUNT()
指示第一个UPDATE确实更改了某些内容,则通过设置column = column来使更改为空。
UPDATE table SET column='foobar' WHERE (foo) AND (bar) AND column='null' LIMIT 1;
UPDATE table SET column=IF(ROW_COUNT()=1,column,'foobar') WHERE column='null' LIMIT 1;
但是,请注意,如果第一个UPDATE匹配行,则ROW_COUNT()返回0,但没有进行任何净更改,因为找到的行已经具有值'foobar'。