[英]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.