繁体   English   中英

SQL Server 2005创建约束或索引视图

[英]SQL Server 2005 create constraint or indexed view

我在这里阅读过很多关于创建约束或索引视图的文章,但是我之前从未写过复杂的约束,我希望有人可以告诉我最佳方法。 我基本上有一个具有如下结构的表,一条记录只能有1个活动管理员。

 Id     Admin
 --     ------
 1      1
 1      null
 1      null
 2      1
 2      null
 2      null

我只写了一个常规约束语句,但很快意识到这是行不通的,因为多个空值不是唯一的。 有没有办法修改此约束以禁止/忽略空值?

  ALTER TABLE dbo.table
  ADD CONSTRAINT OnlyOneAdmin UNIQUE(Id, Admin)

根据我的研究,索引视图似乎是一个不错的选择,但我担心创建此视图会带来过多的开销。 我不确定下面的视图是否正确构造以实现所需的结果。

 CREATE VIEW AdminView WITH SCHEMABINDING AS
     SELECT Admin 
     FROM dbo.table 
     WHERE Admin IS NOT NULL;
 GO

 CREATE UNIQUE CLUSTERED INDEX AdminUnique 
 ON dbo.AdminView(Admin);

非常感谢任何指导,谢谢。

另一个问题:为此,使用计算列会更好吗?

我认为您想要的是一个过滤索引。 不幸的是,仅在2008及更高版本中可用:

CREATE UNIQUE INDEX OnlyOneAdmin
  ON dbo.table (Id)
  WHERE Admin IS NOT NULL ;

对于2005,这应该可以工作(请测试,我没有可用的2005版本来检查它。)它与您拥有的代码非常接近,但是在某些地方用Admin替换了Id

CREATE VIEW AdminView WITH SCHEMABINDING AS 
  SELECT Id 
  FROM dbo.table 
  WHERE Admin IS NOT NULL; 

CREATE UNIQUE CLUSTERED INDEX AdminUnique 
  ON dbo.AdminView (Id) ;

您可以在表上创建AFTER TRIGGER以强制执行此要求。

一旦您将某行更新为新管理员,就可以将触发器设置为将所有其他行更新为普通用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM