Postgresql
僅在 NULL 時才允許更新 SQL 列
**tldr:**是否可以創建強制執行的約束:僅當列的目前值為 NULL 時才允許更新列。
當使用者採取行動時,我正在使用 Postgresql 將列從 NULL 更新為外鍵。
理想情況下,它是這樣工作的:
- 使用者執行操作。
- 如果列是 NULL,做一堆東西並將該列更新為新的外鍵。否則,跳到 3。
- 使用該列中的外鍵做某事。
但是,兩個使用者可以同時執行該操作。在這種情況下,步驟 2 將發生兩次,因為對於兩個使用者,在操作開始時,該列仍然為空。然後,稍微早一點的使用者設置的外鍵以及依賴它的任何東西都會失去。
如何確保第 2 步只發生一次?是否可以創建一個僅在目前值為空時才允許更新該列的約束?或者,在事務的最後,我應該檢查列是否已經設置,然後在伺服器級別處理它?
您可以創建一個
AFTER UPDATE
引發異常的觸發器,但有更好的方法:
SELECT ... FOR NO KEY UPDATE
在讀取行時使用以防止並發修改(悲觀鎖定)。- 使用
REPEATABLE READ
隔離級別,如果有並發更新並且可以重複事務(樂觀“鎖定”),您將收到序列化錯誤。
這聽起來像是數據庫中的業務邏輯。另外,當列從一個值(比如說 2)更新回 NULL 時,你會怎麼做?如果使用者再次將其更改為不同的值(比如 3)怎麼辦?