我有一個表,我正在做邏輯刪除。我有一列Name
和一列Is_Active
。 Name
是varchar
和是bool
。如何讓一個布爾值索引唯一爲真
我不能讓Name
唯一,因爲會有多行具有相同的名稱。其中Is_Active == False
。
我需要確保在任何時候只有一個記錄Name
其中Is_Active == True
。
有沒有一種方法可以做到這一點?或者有人可以提出更好的方法嗎?
我有一個表,我正在做邏輯刪除。我有一列Name
和一列Is_Active
。 Name
是varchar
和是bool
。如何讓一個布爾值索引唯一爲真
我不能讓Name
唯一,因爲會有多行具有相同的名稱。其中Is_Active == False
。
我需要確保在任何時候只有一個記錄Name
其中Is_Active == True
。
有沒有一種方法可以做到這一點?或者有人可以提出更好的方法嗎?
您可以創建在數據庫級獨特的過濾指數:
CREATE UNIQUE INDEX UQ_EmployeeName
ON Employee (Name)
WHERE Is_Active = 1
上述指數將不會允許像('Bob', 1)
重複記錄。它將允許儘管像('Bob', 1)
,('Bob', 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