SQL Server:检查布尔值只能作为true出现一次

SQL Server:检查布尔值只能作为true出现一次,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,在SQL Server 2008 R2中,我有一个带有[Id]、[Name]和[bDefault]的表。所有列都不可为空 检查bDefault是否可能仅对一条记录为真?将其设置为唯一索引将不起作用,因为只有max 1记录为真,其余记录均为假。使用过滤后的唯一索引: CREATE UNIQUE INDEX IX_... ON [Table](bDefault) WHERE bDefault = 1 在sql server 2008之前,可以使用触发器防止重复值。以下是一个例子: CREATE T

在SQL Server 2008 R2中,我有一个带有
[Id]
[Name]
[bDefault]
的表。所有列都不可为空


检查
bDefault
是否可能仅对一条记录为真?将其设置为唯一索引将不起作用,因为只有max 1记录为真,其余记录均为假。

使用过滤后的唯一索引:

CREATE UNIQUE INDEX IX_... ON [Table](bDefault) WHERE bDefault = 1

在sql server 2008之前,可以使用触发器防止重复值。以下是一个例子:

CREATE TABLE xxx(a bit)

go

CREATE TRIGGER xxx_trg
ON xxx
AFTER INSERT, UPDATE
as
IF exists
  (SELECT 1
   FROM xxx
   WHERE a = 1
   GROUP BY a
   HAVING count(*) > 1
  )
    BEGIN
    RAISERROR ('Already exists', 16, 1);
    ROLLBACK transaction;
    RETURN
END

5分钟后我可以接受。非常感谢,以前没有听说过过滤的唯一索引。离题;这在2008年的整个UI中是无法创建的,是吗?@IvanM:Management Studio对过滤索引的支持至少在Management Studio 2014中存在(“新建索引”对话框的“过滤器”选项卡),但我不知道以前的版本。该功能本身是在SQL Server 2008中添加的,因此可能是SSMS滞后(我自己从未使用它来创建数据库对象)。我认为在SQL2012中也可以这样做,但在2008R2中不能。是的,如果它贯穿“管理索引和键”,那么它确实是不可能的。@Jeroenmoster你是对的,这些评论让我相信,过滤指数在2008年是不可能的。我已更正我的查询,仅不允许1