我可以在2个字段上创建唯一约束,在布尔字段上创建条件

时间:2013-01-23 08:18:32

标签: sql-server tsql sql-server-2005

  

可能重复:
  Simple CHECK Constraint not so simple

我们有一个包含用户角色的表。 它看起来像这样:

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

1 个答案:

答案 0 :(得分:2)

您可以对RoleIdPersonId使用唯一约束,并为所有非活动角色使用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)
)