ホームページ >データベース >mysql チュートリアル >SQL UPDATEの前に古い列の値を取得するにはどうすればよいですか?

SQL UPDATEの前に古い列の値を取得するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-04 07:39:38173ブラウズ

How to Retrieve Old Column Values Before an SQL UPDATE?

SQL のみを使用して UPDATE の前に古い列の値を取得する方法

問題ステートメント

SQL の RETURNING 句は、その堅牢な機能にもかかわらず、次のような制限に直面しています。更新後の値のみを取得します。これは、更新された列の元の値を求める場合、特に同時実行性の高い環境ではハードルとなる可能性があります。

自己結合を使用したソリューション

Erwin Brandstetter のソリューションは、自己結合を使用することでこの課題にエレガントに対処しています。 FROM 句での結合:

UPDATE my_table
SET processing_by = our_id_info -- unique to this worker
FROM my_table AS old_my_table
WHERE trans_nbr IN (
  SELECT trans_nbr
  FROM my_table
  GROUP BY trans_nbr
  HAVING COUNT(*) > 1
  LIMIT our_limit_to_have_single_process_grab
)
AND my_table.row_id = old_my_table.row_id
RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by

テーブルの別のインスタンス (old_my_table) に結合することで、クエリは更新が発生する前の値をシームレスに取得します。

同時環境の代替

大量の同時書き込み負荷があるシナリオでは、競合状態を防ぐために追加の対策が必要です。

  1. シリアル化可能な分離レベル: 最も厳格な分離レベルでトランザクションを実行し、他のトランザクションが実行されないようにします。競合しています。
  2. 明示的な行ロック: 更新する行を取得するサブクエリに FOR UPDATE 句を追加し、ロックされた行のみが処理されるようにします。この手法は、シリアル化可能な分離レベルを使用するよりも効率的です。

以上がSQL UPDATEの前に古い列の値を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。