僅使用SQL 檢索更新前值
在觸發器、預存程序或外部實體不可用的場景中,有必要從單獨使用SQL 更新的行中擷取列的舊值。
挑戰
直接從 RETURNING 子句檢索更新前的值是不可能的,因為它只會傳回更新後的值。
使用自連接的解決方案
解決方案是使用唯一標識要更新的行的條件將表連接到其自身的另一個實例。這允許存取 RETURNING 子句中的舊值和新值。
UPDATE my_table SET processing_by = our_id_info FROM my_table AS old_my_table WHERE old_my_table.trans_nbr = my_table.trans_nbr AND my_table.row_id = old_my_table.row_id RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
處理並發
為了避免潛在的競爭條件,防止並發寫入至關重要更新期間相同的行。這可以透過對要更新的行使用明確鎖定來實現:
UPDATE my_table SET processing_by = our_id_info FROM (SELECT * FROM my_table WHERE trans_nbr = 4 FOR UPDATE) AS old_my_table WHERE old_my_table.trans_nbr = my_table.trans_nbr RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
這可確保僅處理由子查詢鎖定的行,從而防止更新衝突。
以上是如何在不使用觸發器或預存程序的情況下檢索 SQL 中更新前的列值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!