僅使用SQL 檢索更新前的列值
在不使用觸發器的情況下檢索更新後行中列的原始值,預存程序或其他外部實體是SQL 中反覆出現的挑戰。為了解決這個問題,我們探索了不同的方法。
初始嘗試和缺點
如原始問題中所述,將FOR UPDATE 與子查詢一起使用包含GROUP BY 子句是不可行的。因此,連接變得不可行。
使用表別名的解決方案
最直接的解決方案是使用表別名將表與其自身連接。透過為表格新增別名,我們可以存取原始值和更新後的值。考慮以下更新查詢:
UPDATE my_table x SET processing_by = our_id_info FROM my_table y WHERE x.trans_nbr = y.trans_nbr AND x.row_id = y.row_id RETURNING y.processing_by AS old_processing_by, x.processing_by;
處理並發寫入操作
為了防止並發寫入操作影響結果,我們可以使用FOR UPDATE子查詢中的 子句。這可確保僅處理子查詢鎖定的行。
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 中更新前的列值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!