我有一张表,我正在进行逻辑删除。我有一列Name
和一列Is_Active
。 Name
是varchar
,Is_active
是bool
。
我无法使Name
唯一,因为会有多个具有相同名称的行。 Is_Active == False
。
我需要确保Name
Is_Active == True
{{1}}只有一条记录。
有没有办法可以做到这一点?或者任何人都可以提出更好的方法吗?
答案 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