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

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

Linda Hamilton
リリース: 2025-01-03 18:51:39
オリジナル
669 人が閲覧しました

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

SQL のみを使用した更新前の値の取得

トリガー、ストアド プロシージャ、または外部エンティティが使用できないシナリオでは、これが必要になります。 SQL を使用して更新された行から列の古い値を取得するには

課題

RETURNING 句から直接更新前の値を取得することは、更新後の値のみを返すため不可能です。

自己結合を使用した解決策

解決策更新される行を一意に識別する条件を使用して、テーブルをそれ自体の別のインスタンスに結合します。これにより、RETURNING 句の古い値と新しい値の両方にアクセスできるようになります。

UPDATE my_table
SET processing_by = our_id_info
FROM my_table AS old_my_table
WHERE old_my_table.trans_nbr = my_table.trans_nbr
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
ログイン後にコピー

同時処理の処理

潜在的な競合状態を回避するには、同時書き込みを防ぐことが重要です。更新中に同じ行に追加されます。これは、更新する行を明示的にロックすることで実現できます。

UPDATE my_table
SET processing_by = our_id_info
FROM (SELECT * FROM my_table WHERE trans_nbr = 4 FOR UPDATE) AS old_my_table
WHERE old_my_table.trans_nbr = my_table.trans_nbr
RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
ログイン後にコピー

これにより、サブクエリによってロックされた行のみが処理され、更新の競合が防止されます。

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

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