【问题标题】:SQL Server 2008: Check constraints that guarantees that only one value in all rows is set to 1 and others are 0SQL Server 2008:检查约束,保证所有行中只有一个值设置为 1,其他为 0
【发布时间】:2010-09-27 14:14:19
【问题描述】:

需要在列上建立约束,保证所有行中只有一个值为 1,其他所有值为 0。

存在带触发器的解决方案,但我想内置一些东西。

这样的事情有可能吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 constraints check-constraint


    【解决方案1】:

    编辑

    实际上我刚刚注意到您使用的是 SQL Server 2008,您可以为此使用过滤索引

    CREATE UNIQUE NONCLUSTERED INDEX UIX ON YourTable (col) where col = 1
    

    原答案

    最简单的方法可能是将这个特殊的 pk 存储在单独的一行表中。通过检查约束可以强制执行不超过一行的方面。

    CREATE TABLE OneRowTable
    (
    lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY CHECK (lock = 'X'),
    OtherTablePK int
    );
    

    否则,假设您可能有一个由正整数组成的 id 字段,您可以添加一个具有以下定义的计算列

    case when col=1 then -1 else id end
    

    并为其添加唯一约束。

    【讨论】:

    • @Tim - 否。在检查约束中使用 UDF 可能会因多行更新和快照隔离而失败。我只是使用过滤索引方法。它将确保最多 1 行可以包含值 1。如果您使用表格定义更新您的问题,我将尝试澄清我的第二个建议。 (编辑:这是对您之前似乎已经消失的评论的回复!)
    • 是的,我已经详细检查过了,它变得很清楚。谢谢!
    • 这还具有显着加快涉及“活动”行的查询的效果,即“where col = 1”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多