ホームページ >データベース >mysql チュートリアル >SQL のみを使用して PostgreSQL で UPDATE 後に古い列の値を取得する方法

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

DDD
DDDオリジナル
2025-01-06 00:52:39266ブラウズ

How to Retrieve Old Column Values After an UPDATE in PostgreSQL Using Only SQL?

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

問題:

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

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