ホームページ >データベース >mysql チュートリアル >SQL のみを使用して PostgreSQL で UPDATE 後に古い列の値を取得する方法
問題:
PostgreSQL では事前の取得が許可されていませんUPDATE ステートメントの RETURNING 句で列の値を更新します。これは、トリガーやプロシージャなどの追加メカニズムを使用せずに更新された列の古い値を取得しようとする場合に課題を引き起こします。
自己結合を使用した解決策:
1 つの解決策FROM 句で自己結合を利用することです。この手法により、テーブルのコピーが効果的に作成され、更新された値と更新前の値の両方を参照できるようになります。
UPDATE tbl x SET tbl_id = 23 , name = 'New Guy' FROM tbl y -- Using the FROM clause WHERE x.tbl_id = y.tbl_id -- Must be UNIQUE NOT NULL AND x.tbl_id = 3 RETURNING y.tbl_id AS old_id, y.name AS old_name , x.tbl_id , x.name;
このメソッドでは、自己結合用の UNIQUE NOT NULL 列が必要であり、各行が確実に一致するようにします。
同時書き込みのソリューションロード:
大量の書き込み同時実行が関係するシナリオでは、競合状態を防ぐために 2 つのオプションが存在します:
オプション 1: SERIALIZABLE 分離レベル:
SERIALIZABLE 分離レベルを使用すると、トランザクション実行中の行への排他的アクセスが確保され、同時実行が防止されます。 writes:
BEGIN ISOLATION LEVEL SERIALIZABLE; UPDATE ... ; COMMIT;
オプション 2: 明示的ロック:
または、行の同時更新を防ぐために明示的ロックを使用することもできます:
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;
以上がSQL のみを使用して PostgreSQL で UPDATE 後に古い列の値を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。