【发布时间】:2018-06-27 21:43:21
【问题描述】:
我正在尝试构建对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;
我也尝试构建子查询,但未能获得所需的行为。
我担心使用计数可能会导致出现竞争条件?不过,我不确定是否有更好的方法。
非常感谢任何帮助!
【问题讨论】:
-
如果唯一关心的是竞争条件,为什么不在存储过程中构建所有这些,并使其成为事务?您需要将事务隔离级别设置为(可能)READ-COMMITTED,如果您需要锁定行,请添加
FOR UPDATE。 -
@Chosun,谢谢。我想允许对表进行并发更新,但防止尝试更新同一行。在前面的例子中,我看到整个表都被锁定了;这不是可接受的瓶颈。
-
没问题;祝你好运!
标签: mysql sql database if-statement sql-update