2

有没有办法在单个查询中选择一条记录并更新它?

我试过这个:

UPDATE arrc_Voucher 
  SET ActivatedDT = now() 
WHERE (SELECT VoucherNbr, VoucherID
         FROM arrc_Voucher
        WHERE ActivatedDT IS NULL
          AND BalanceInit IS NULL
          AND TypeFlag = 'V'
        LIMIT 1 )

我希望运行选择查询并获取与 where 子句匹配的第一条记录,更新该记录中的 ActivatedDT 字段,但出现以下错误:

1241 - 操作数应包含 1 列

有任何想法吗?

4

2 回答 2

3

怎么样:

UPDATE arrc_Voucher 
  SET ActivatedDT = NOW() 
WHERE ActivatedDT IS NULL
  AND BalanceInit IS NULL
  AND TypeFlag = 'V'
LIMIT 1;
于 2010-10-28T18:59:23.280 回答
0

MySQL API 文档

UPDATE 返回实际更改的行数

您不能同时选择一行并更新它,您需要执行两个查询来实现它;获取您的记录,然后更新它。

如果您担心并发进程通过某种竞争条件访问同一行(假设您的用例涉及高流量),您可以考虑其他替代方案,例如锁定表(注意其他进程将需要恢复--重试- - 如果表在访问时被锁定)

或者,如果您可以创建存储过程,您可能需要阅读这篇文章MySQL API 文档

但大约 99% 的情况下,这不是必需的,两个查询将毫无问题地执行。

于 2010-10-28T19:17:43.800 回答