可以在可以包含 NULL 的列上创建唯一约束。但是,最多只有一行可以在该列中包含 NULL。
我不明白为什么会出现这种情况,因为根据定义,一个 NULL 不等于另一个 NULL(因为 NULL 实际上是一个未知值,一个未知值不等于另一个未知值)。
我的问题: 1、为什么会这样呢? 2. 这是MsSQL特有的吗?
我有一种预感,这是因为唯一约束可以充当外键的引用字段,否则如果有多个记录为 NULL,则 FK 将不知道它所引用的引用表中的哪一条记录存在。但是,这只是一种预感。
(是的,我知道 UC 可以跨多个列,但这并没有改变问题;相反,它只是让问题变得有点复杂。)
最佳答案
是的,它是“特定于”Microsoft SQL Server 的(因为一些其他数据库系统具有相反的方法,即您所期望的方法 - 以及 ANSI 标准中定义的方法,但我相信有是与 SQL Server 相同的其他数据库系统。
如果您正在使用支持筛选索引的 SQL Server 版本,则可以应用其中之一:
CREATE UNIQUE INDEX IX_T ON [Table] ([Column]) WHERE [Column] IS NOT NULL
(但请注意,该索引不能成为 FK 约束的目标)
<小时/>它的“原因”实际上归结为,这就是它很久以前实现的方式(可能是预标准),这是一种尴尬的情况,现在改变它可能会破坏许多现有系统。
回复:外键 - 如果不是因为外键列中的 NULL
值导致外键不被检查,您是正确的 - 没有办法(在 SQL Server 中)使用 NULL
作为实际键。
关于sql - 唯一约束列只能包含一个 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17485127/