首頁 > 資料庫 > mysql教程 > 如何僅使用 SQL 在 PostgreSQL 中更新後檢索舊列值?

如何僅使用 SQL 在 PostgreSQL 中更新後檢索舊列值?

DDD
發布: 2025-01-06 00:52:39
原創
286 人瀏覽過

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

如何只使用SQL 取得預更新列值

問題:

PostgreSQL 不允許語句更新的RETURNING 子句中的列值。當尋求在不使用觸發器或程序等額外機制的情況下獲取更新列的舊值時,這構成了挑戰。

使用自連接的解決方案:

一個解決方案是利用 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 列進行自連接,確保每行都匹配到連線實例中的單一對應項。

並發寫入解決方案負載:

在涉及大量寫入並發的場景中,存在兩種防止競爭條件的選項:

選項1:可串列化隔離等級:

利用SERIALIZABLE隔離等級確保事務執行期間對行的獨佔訪問,從而防止並發寫入:

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 中更新後檢索舊列值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板