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 )

selectクエリを実行し、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 は、実際に変更された行数を返します

行を選択して同時に更新することはできません。それを実現するには、2 つのクエリを実行する必要があります。レコードを取得してから更新します。

ある種の競合状態を介して同じ行にアクセスする並行プロセスについて心配している場合 (ユース ケースが高トラフィックを伴う場合)、テーブルをロックするなどの他の代替手段を検討することができます(他のプロセスは回復する必要があることに注意してください--再試行- -アクセス中にテーブルがロックされている場合)

または、ストアド プロシージャを作成できる場合は、この記事またはMySQL API ドキュメントを参照してください。

しかし、約 99% の場合、これは必要なく、2 つのクエリは問題なく実行されます。

于 2010-10-28T19:17:43.800 に答える