Postgresql

僅在 NULL 時才允許更新 SQL 列

  • March 7, 2022

**tldr:**是否可以創建強制執行的約束:僅當列的目前值為 NULL 時才允許更新列。

當使用者採取行動時,我正在使用 Postgresql 將列從 NULL 更新為外鍵。

理想情況下,它是這樣工作的:

  1. 使用者執行操作。
  2. 如果列是 NULL,做一堆東西並將該列更新為新的外鍵。否則,跳到 3。
  3. 使用該列中的外鍵做某事。

但是,兩個使用者可以同時執行該操作。在這種情況下,步驟 2 將發生兩次,因為對於兩個使用者,在操作開始時,該列仍然為空。然後,稍微早一點的使用者設置的外鍵以及依賴它的任何東西都會失去。

如何確保第 2 步只發生一次?是否可以創建一個僅在目前值為空時才允許更新該列的約束?或者,在事務的最後,我應該檢查列是否已經設置,然後在伺服器級別處理它?

您可以創建一個AFTER UPDATE引發異常的觸發器,但有更好的方法:

  1. SELECT ... FOR NO KEY UPDATE在讀取行時使用以防止並發修改(悲觀鎖定)。
  2. 使用REPEATABLE READ隔離級別,如果有並發更新並且可以重複事務(樂觀“鎖定”),您將收到序列化錯誤。

您可能想查看這個問題這個問題。

這聽起來像是數據庫中的業務邏輯。另外,當列從一個值(比如說 2)更新回 NULL 時,你會怎麼做?如果使用者再次將其更改為不同的值(比如 3)怎麼辦?

引用自:https://dba.stackexchange.com/questions/308356