如何允许布尔索引仅对True是唯一的

时间:2015-04-20 14:02:16

标签: sql-server entity-framework

我有一张表,我正在进行逻辑删除。我有一列Name和一列Is_ActiveNamevarcharIs_activebool

我无法使Name唯一,因为会有多个具有相同名称的行。 Is_Active == False

我需要确保Name Is_Active == True {{1}}只有一条记录。

有没有办法可以做到这一点?或者任何人都可以提出更好的方法吗?

3 个答案:

答案 0 :(得分:6)

您可以在数据库级别创建唯一的筛选索引:

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

上述索引不允许重复记录,例如('Bob', 1)。它允许('Bob', 1)('Bob', 0)等记录在您的数据库中共存。

答案 1 :(得分:2)

允许条件为“不为0”的过滤索引。 0代表假。这样,只能存在一个真实值。您无需创建可为空的列,只需使用filter忽略该假值即可。

EF核心示例:

entity.HasIndex(x => new {x.ArticleId, x.IsActive}).IsUnique().HasFilter("[IsActive] != 0");

这不是解决方法,所以我喜欢它!

答案 2 :(得分: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