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

时间:2018-06-27 21:43:22

标签: mysql sql database if-statement sql-update

我正在尝试对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;

我也尝试构造一个子查询,但是没有运气来获得想要的行为。

我担心使用计数可能会导致比赛条件的机会?我不确定是否有更好的方法。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

如果我理解正确,则可以只使用order bylimit

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'。