簡體   English   中英

postgresql - 與提取約束唯一

[英]postgresql - unique with extract constraint

這是我遇到的唯一約束問題:假設我有一個表app_user。 它有一個列“name”和一列“is_active”。 因此,如果“is_active”為false,則刪除該用戶。

現在我想要對“name”列進行唯一約束。 然后用戶被刪除,然后有人想要再次添加具有相同名稱的用戶,由於唯一約束,它失敗了。 我可以將檢查放在上層(對於用戶觸發的操作,這些操作並不真正發生,通常它可能足夠安全,盡管它是額外的代碼)。

但我想設置一個PostgreSQL唯一約束,它只能在is_active = true的行上運行。

我查看了PostgreSQL 9 EXCLUDES功能。

我想出了類似的東西:

alter table test add exclude (name with =, is_active with ||)

所以這個想法是,所以存在一個獨特的沖突,我必須有兩個相同的名稱,並且is_active也必須是真的。 可悲的是|| 在這種情況下,運算符不存在。

無論如何可以實現嗎? 或者您是否建議其他仍然符合要求的解決方案(能夠重新創建與已刪除用戶同名的用戶)? 一種選擇是,這是不可能的,但阻止用戶永遠訪問某個用戶名有點強。

此外,業務邏輯並不真正依賴於非重復,但它仍然是一種健康的做法,以防止它。 在這種情況下,我將導入系統中的數據,並通過名稱進行導入。 所以,如果我有兩個同名的記錄,我就會遇到問題。 如果在6個月前刪除了該名稱的記錄並且同時創建了一個新記錄,則這不是問題。

如果有一個解決方案也兼容其他SQL服務器,我會很高興,但我懷疑存在...而且,我寧願不添加額外的表來實現這一點。 所以我想這可能是排除方式還是沒有...

您不需要排除約束。

部分唯一索引就足夠了

create unique index unique_active_name 
   on app_user (name)
   where is_active;

(這假設is_active被定義為boolean

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM