首页 > 解决方案 > 是否可以在唯一约束中忽略 null?

问题描述

我的表中有 2 个字段,IDProvider 和参考。表是这样的:

ID
MyOwnReference
IDProvider
Reference

我希望如果 IDProvider 和 Reference 都不为空,约束应该检查是否有重复,因为提供者不能有重复的引用。但是,我想避免检查其中至少一个是否为空。因为我可以知道提供者但不知道参考,或者我可以知道参考但不知道提供者(我接受这可能有点奇怪,如果我知道参考,我必须知道提供者)。但无论如何,我想处理这种可能性。

我试图创建一个唯一索引,但是当我尝试添加第二条 IDProvider 和 Reference 为 null 的记录时,我收到一个错误,指出该值是重复的,因为存在一个具有 null、null 值的索引。

我正在使用 Sql Server 2017 express。

另一种选择是拥有一个 [Unkown] 提供程序并向他分配一个虚拟引用,但这使我向我的应用程序添加更多逻辑以确定它不重复的引用。

无论如何,我可以接受想法,因为我可以改变这种行为,这不是问题,如果真的是具有空值的索引,那是一个非常糟糕的主意。

谢谢。

标签: sql-server

解决方案


您可以在这两个字段上创建唯一的过滤非聚集索引,其中仅包括两个字段都填充的那些记录:

create unique nonclustered index IX_UNIQUE_FILTERED on dbo.MyTable(IDProvider, Reference)
where IDProvider is not null and Reference is not null

推荐阅读