首頁 >資料庫 >mysql教程 >如何在不使用觸發器或預存程序的情況下檢索 SQL 中更新前的列值?

如何在不使用觸發器或預存程序的情況下檢索 SQL 中更新前的列值?

Linda Hamilton
Linda Hamilton原創
2025-01-03 18:51:39647瀏覽

How Can I Retrieve Pre-Update Column Values in SQL Without Using Triggers or Stored Procedures?

僅使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn