我们有一个包含用户角色的表。 它看起来像这样:
Id, RoleId, PersonId, Active
活动列用于软删除功能:当您删除用户的角色时,实际上将active
设置为false
。
因此,您可以使用相同roleid-personid-active
组合的多行,但仅当活动位设置为false时才可以。
所以这是有效的数据:
Id RoleId PersonId Active
1 1 1 false
2 1 1 false
3 1 1 false
4 1 1 false
但这不是,因为您在任何时刻都只能有一个活动角色(因此不应插入记录3):
Id RoleId PersonId Active
1 1 1 false
2 1 1 true
3 1 1 true
我的问题是:我可以在RoleId, PersonId and Active
上创建一个唯一约束,其中active
等于true
吗?
PS。 Sql server版本是2005
答案 0 :(得分:2)
您可以对RoleId
,PersonId
使用唯一约束,并为所有非活动角色使用Id
的计算列,并为所有活动角色使用null
。
create table Roles
(
Id int identity primary key,
RoleId int not null,
PersonId int not null,
Active bit,
ActiveInt as case Active when 0 then Id end,
constraint UQ_RolePersonActive unique (RoleId, PersonId, ActiveInt)
)