如何在mySQL中同时选择和更新记录?

时间:2010-10-28 18:56:55

标签: mysql sql sql-update mysql-error-1241

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

我试过了:

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 )

我希望运行select查询并获取匹配where子句的第一条记录,更新该记录中的ActivatedDT字段,但是我收到以下错误:

  

1241 - 操作数应包含1列

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

怎么样:

UPDATE arrc_Voucher 
  SET ActivatedDT = NOW() 
WHERE ActivatedDT IS NULL
  AND BalanceInit IS NULL
  AND TypeFlag = 'V'
LIMIT 1;

答案 1 :(得分:0)

来自MySQL API documentation

UPDATE返回实际更改的行数

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

如果您担心并发进程在某种竞争条件下访问同一行(假设您的用例涉及高流量),您可以考虑其他替代方案,例如locking the table(请注意其他进程需要recover - retry - 如果表在访问时被锁定了)

或者,如果您可以创建存储过程,则可能需要阅读this articleMySQL API documentation

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