如果行存在,如何更新非唯一列?是否在[mysql]中更新其他行?

uajslkp6  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(363)

我正在尝试构造一个查询 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;

我也尝试过构造子查询,但没有成功地获得所需的行为。
我担心使用计数可能会导致比赛条件的机会?不过,我不确定是否有更好的办法。
非常感谢您的帮助!

62lalag4

62lalag41#

如果我理解正确,你可以用 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
7uhlpewt

7uhlpewt2#

像这样的?我不能保证这么快:

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>
    );
piok6c0g

piok6c0g3#

这里有一个方法。运行第一个更新。运行之后,函数 ROW_COUNT() 将返回0或1,具体取决于第一次更新是否影响任何行。
在第二次更新中,将column=column if设置为no op ROW_COUNT() 指示第一次更新确实更改了某些内容。

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;

但是,请注意,如果第一次更新与行匹配,row\u count()将返回0,但没有进行任何净更改,因为它找到的行已经具有值“foobar”。

相关问题