我正在尝试构造一个查询 UPDATE
如果行存在,则更新其他行。我只希望每次执行查询时更新一行。第二个 WHERE
用于查询的第一部分没有返回的情况。
我希望更新一个默认值为的属性 'null'
. 没有一种方法可以像我在其他文章(例如)中看到的那样使用公钥。
我可以用一个 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;
我也尝试过构造子查询,但没有成功地获得所需的行为。
我担心使用计数可能会导致比赛条件的机会?不过,我不确定是否有更好的办法。
非常感谢您的帮助!
3条答案
按热度按时间62lalag41#
如果我理解正确,你可以用
order by
以及limit
:这个
desc
将把符合这两个条件的行放在第一位。然后它将被其他行跟随。这个limit
选择第一个匹配项。我想我更倾向于把这两个条件分开排序:
7uhlpewt2#
像这样的?我不能保证这么快:
piok6c0g3#
这里有一个方法。运行第一个更新。运行之后,函数
ROW_COUNT()
将返回0或1,具体取决于第一次更新是否影响任何行。在第二次更新中,将column=column if设置为no op
ROW_COUNT()
指示第一次更新确实更改了某些内容。但是,请注意,如果第一次更新与行匹配,row\u count()将返回0,但没有进行任何净更改,因为它找到的行已经具有值“foobar”。