sql-server - 是否可以在唯一约束中忽略 null?
问题描述
我的表中有 2 个字段,IDProvider 和参考。表是这样的:
ID
MyOwnReference
IDProvider
Reference
我希望如果 IDProvider 和 Reference 都不为空,约束应该检查是否有重复,因为提供者不能有重复的引用。但是,我想避免检查其中至少一个是否为空。因为我可以知道提供者但不知道参考,或者我可以知道参考但不知道提供者(我接受这可能有点奇怪,如果我知道参考,我必须知道提供者)。但无论如何,我想处理这种可能性。
我试图创建一个唯一索引,但是当我尝试添加第二条 IDProvider 和 Reference 为 null 的记录时,我收到一个错误,指出该值是重复的,因为存在一个具有 null、null 值的索引。
我正在使用 Sql Server 2017 express。
另一种选择是拥有一个 [Unkown] 提供程序并向他分配一个虚拟引用,但这使我向我的应用程序添加更多逻辑以确定它不重复的引用。
无论如何,我可以接受想法,因为我可以改变这种行为,这不是问题,如果真的是具有空值的索引,那是一个非常糟糕的主意。
谢谢。
解决方案
您可以在这两个字段上创建唯一的过滤非聚集索引,其中仅包括两个字段都填充的那些记录:
create unique nonclustered index IX_UNIQUE_FILTERED on dbo.MyTable(IDProvider, Reference)
where IDProvider is not null and Reference is not null
推荐阅读
- javascript - 在页面离开时向用户发送邮件
- iis - 如何使用 WMI 代码在服务器上安装 IIS 版本
- javascript - 从 HTML 表中获取 onclick 值以输入表单 JavaScript
- node.js - 访问nodejs项目外的目录和文件
- magento - 此产品与当前选项不可用 Magento
- symfony - 学说继承:更新实体字段
- python - 通过 python IMAP 使用消息 ID 检索/搜索电子邮件
- php - 测试时 Laravel 邮件问题
- python - 屏蔽 Y 数组以仅获取 X1==X2 的值
- python - Python Flask:超时通过 SQL Alchemy ORM + Pandas 执行的查询