問題:
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中文網其他相關文章!