ホームページ > データベース > mysql チュートリアル > トリガーやストアド プロシージャを使用せずに SQL で更新前の列の値を取得するにはどうすればよいですか?

トリガーやストアド プロシージャを使用せずに SQL で更新前の列の値を取得するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-04 07:33:34
オリジナル
787 人が閲覧しました

How Can I Retrieve Pre-Update Column Values in SQL Without Triggers or Stored Procedures?

SQL のみを使用して更新前の列の値を取得する

トリガーを使用せずに、更新後に行内の列の元の値を取得し、格納プロシージャやその他の外部エンティティは、SQL で繰り返し発生する課題です。これに対処するために、さまざまなアプローチを検討します。

初期の試行と欠点

元の質問で述べたように、サブクエリで FOR UPDATE を使用します。 GROUP BY 句を含むことは実現できません。

テーブル エイリアスを使用した解決策

最も簡単な解決策は、テーブル エイリアスを使用してテーブルをそれ自体と結合することです。テーブルに別名を付けることで、元の値と更新された値の両方にアクセスできます。次の更新クエリを考えてみましょう。

UPDATE my_table x
SET processing_by = our_id_info
FROM my_table y
WHERE x.trans_nbr = y.trans_nbr
AND x.row_id = y.row_id
RETURNING y.processing_by AS old_processing_by, x.processing_by;
ログイン後にコピー

同時書き込み操作の処理

同時書き込み操作が結果に影響を与えるのを防ぐために、FOR UPDATE を利用できます。サブクエリ内の 句。これにより、サブクエリによってロックされた行のみが処理されるようになります。

UPDATE tbl x
SET tbl_id = 24, name = 'New Gal'
FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 FOR UPDATE) y 
WHERE x.tbl_id = y.tbl_id
RETURNING y.tbl_id AS old_id, y.name AS old_name, x.tbl_id, x.name;
ログイン後にコピー

その他の考慮事項

  • 自己結合に使用される列は一意である必要があります。
  • の同時実行要件を正確に把握することが重要です。
  • SERIALIZABLE 分離レベルを使用すると、パフォーマンスを犠牲にして信頼性の高い同時更新を確保できます。
  • または、FOR UPDATE を使用した明示的なロックにより、信頼性とパフォーマンスのバランスを提供します。

以上がトリガーやストアド プロシージャを使用せずに SQL で更新前の列の値を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート