2015-04-20 67 views
1

我有一個表,我正在做邏輯刪除。我有一列Name和一列Is_ActiveNamevarchar和​​是bool如何讓一個布爾值索引唯一爲真

我不能讓Name唯一,因爲會有多行具有相同的名稱。其中Is_Active == False

我需要確保在任何時候只有一個記錄Name其中Is_Active == True

有沒有一種方法可以做到這一點?或者有人可以提出更好的方法嗎?

回答

5

您可以創建在數據庫級獨特的過濾指數:

CREATE UNIQUE INDEX UQ_EmployeeName 
ON Employee (Name) 
WHERE Is_Active = 1 

上述指數將不會允許像('Bob', 1)重複記錄。它將允許儘管像('Bob', 1),('Bob', 0)這樣的記錄共存在您的數據庫中。

0

當你想爲一個唯一的名稱多行並且你想最多隻有一個是主動的,我建議你這個解決方案:
(我想,當你有多個活動的名字,只有最後一個或最近的一個應該激活)

UPDATE dt 
SET dt.Is_Active = 0 
FROM (
    SELECT 
     *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Is_Active DESC) As Rn 
    FROM 
     Employee e) dt 
WHERE 
    Is_Active = 1 And Rn > 1