SQL Server:检查布尔值只能作为true出现一次
在SQL Server 2008 R2中,我有一个带有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
[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