sql - 唯一约束列只能包含一个 NULL 值

标签 sql sql-server null

可以在可以包含 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/

相关文章:

mysql - MySQL 使用 Group By 进行联接时查询性能较差

mysql - 使用 CASE EXPRESSION 的列到行

mysql left outer join 有两个条件

c# - NHibernate 尝试在不存在的列中查询

sql-server - SQL Server XML 文件更新一个节点的值,其中另一个节点的文本为 XXX

sql - 使用触发器实现引用完整性操作 (SQL Server)

django - 注释在不存在的值上返回 null,我想将其转换为 null 为空字符串

android - 空头 httpclient android

javascript - 如何将sql添加到javaScript函数中?

javascript - 在 JavaScript 中使用 null 而不是 undefined 的原因是什么?