4

可能重复:
简单的​​ CHECK 约束不是那么简单

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

Id, RoleId, PersonId, Active

活动列用于软删除功能:当您删除用户的角色时,您实际上设置activefalse. 因此,您可以有多个具有相同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, where activeequals上创建一个唯一的约束true吗?

附言。sql server 版本是2005

4

1 回答 1

2

您可以在 上使用唯一约束RoleId,以及适用于所有非活动角色和所有活动角色PersonId的计算列。Idnull

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)
)
于 2013-01-23T09:52:04.080 回答