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

时间:2014-01-02 21:04:55

标签: sql sql-server-2005

我一直在阅读很多有关创建约束或索引视图的帖子,但我之前从未写过复杂的约束,我希望有人可以告诉我最好的方法。我基本上有一个像下面这样结构的表,一个记录只能有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);

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

附加问题:为此使用计算列会更好吗?

2 个答案:

答案 0 :(得分:1)

我认为你想要的是过滤索引。不幸的是仅在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) ;

答案 1 :(得分:0)

您可以在桌面上创建一个AFTER TRIGGER来强制执行此要求。

将行更新为新管理员后,您的触发器将设置为将所有其他行更新为普通用户。