【问题标题】:Add special constraint to avoid duplicate rows with this condition?添加特殊约束以避免此条件下的重复行?
【发布时间】:2016-08-10 08:02:20
【问题描述】:

我有一张如下所示的表格:

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?

感谢任何帮助。

【问题讨论】:

  • 我们在谈论什么样的桌子?这是 Oracle、mySql 还是什么?您希望哪组价值观独一无二?在大多数关系数据库系统中,您只需指定一组列是唯一的。如:alter table myTable 添加约束 myUniqueConstraint(FloorNum, BedNum, IsActive);

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


【解决方案1】:

您可以使用 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 在此示例中不是必需的,但如果我错了,您也可以将其添加到索引中。

【讨论】:

    【解决方案2】:

    你可以在你的桌子上添加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
    

    【讨论】:

    • 如果您尝试一次插入多条记录,这将不起作用。
    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多