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

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

Linda Hamilton
發布: 2025-01-04 07:33:34
原創
773 人瀏覽過

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

僅使用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;
登入後複製

其他注意事項

  • 用於自聯接的欄位必須是唯一的且 not null。
  • 準確捕捉並發需求至關重要
  • 使用 SERIALIZABLE 隔離等級可以確保可靠的並發更新,但會犧牲效能。
  • 或者,使用 FOR UPDATE 明確鎖定可以在可靠性和效能之間取得平衡。

以上是如何在沒有觸發器或預存程序的情況下檢索 SQL 中更新前的列值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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