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 サイトの他の関連記事を参照してください。