添加特殊约束以避免具有此条件的重复行?

时间:2016-04-18 14:10:14

标签: sql sql-server sql-server-2008 tsql unique-constraint

我有一个看起来像这样的表:

ClientId  FloorNum   BedNum   IsActive
11        2          212      1        
12        2          214      0        
12        2          214      1        
13        2          215      0        
13        2          215      0        
13        2          215      0        
13        2          215      0        
13        2          215      1        
12        2          215      1        

如您所见, FloorNum / BedNum 组合 2/215 有两行 IsActive 等于1.这不可能发生。

另一方面,一个 FloorNum / BedNum 组合可以有很多行,其中 IsActive 等于0。

如何向表中添加约束,以便 FloorNum / BedNum 组合只能有一行 IsActive = 1?

感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

您可以使用WHERE子句创建a filtered unique index

CREATE UNIQUE NONCLUSTERED INDEX IX_[index name]_FloorNum_BedNum ON [myTable] (
    FloorNum ASC,
    BedNum ASC)
WHERE (IsActive = 1)

这只会考虑IsActive列设置为1的记录。

根据您的描述,我认为在此示例中不需要ClientId,但如果我错了,您也可以将其添加到索引中。

答案 1 :(得分:0)

您可以在桌面上添加Trigger来检查此情况。

create TRIGGER tr_check_unique ON YourTable
FOR INSERT
AS
    declare @FloorNum int;
    declare @BedNum int;

    select @FloorNum=i.FloorNum from inserted i;    
    select @BedNum=i.BedNum from inserted i;    

begin try
        if exists(select FloorNum  ,BedNum  from YourTable
        where FloorNum=@FloorNum and BedNum=@BedNum and IsActive=1)

        raiserror ('',16,1)
end try

begin catch
raiserror ('record is not unique',16,1)
end catch