是否可以在唯一约束中忽略 null?

Álv*_*cía 0 sql-server

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

ID
MyOwnReference
IDProvider
Reference
Run Code Online (Sandbox Code Playgroud)

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

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

我正在使用 Sql Server 2017 express。

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

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

谢谢。

And*_*lov 5

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

create unique nonclustered index IX_UNIQUE_FILTERED on dbo.MyTable(IDProvider, Reference)
where IDProvider is not null and Reference is not null
Run Code Online (Sandbox Code Playgroud)