我一直在阅读很多有关创建约束或索引视图的帖子,但我之前从未写过复杂的约束,我希望有人可以告诉我最好的方法。我基本上有一个像下面这样结构的表,一个记录只能有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);
非常感谢任何指导,感谢提前。
附加问题:为此使用计算列会更好吗?
答案 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来强制执行此要求。
将行更新为新管理员后,您的触发器将设置为将所有其他行更新为普通用户。