2013-01-23 18 views
3

可能重複:
Simple CHECK Constraint not so simple我能上一個布爾字段創建2個字段的唯一約束和條件

我們有一個表的用戶角色。 它看起來像這樣:

Id, RoleId, PersonId, Active 

活動列用於softdelete functionallity:當你刪除一個用戶的角色,你居然設置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唯一約束,其中active等於true

ps。 SQL Server版本是2005年

回答

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) 
) 
相關問題