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

时间:2019-02-15 13:01:05

标签: sql-server

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

ID
MyOwnReference
IDProvider
Reference

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

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

我正在使用Sql Server 2017 Express。

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

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

谢谢。

1 个答案:

答案 0 :(得分:2)

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

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