可以在包含NULL的列上创建唯一约束.但是,最多只有一行可能在该列中包含NULL.
我不明白为什么会这样,因为根据定义,NULL不等于另一个NULL(因为NULL实际上是一个未知值,一个未知值不等于另一个未知值).
我的问题:
1.为什么会这样?
2.这是针对Mssql的吗?
我有一种预感,因为唯一约束可以充当外键的引用字段,并且如果存在多个具有NULL的记录,则FK否则将不知道它引用的引用表中的哪条记录.但是,这只是一种预感.
(是的,我理解UC可以跨多个列,但这不会改变问题;相反,它只会使它复杂化.)
解决方法
是的,它是“特定的”Microsoft sql Server(因为其他一些数据库系统有相反的方法,你期望的那个 – 以及ANSI标准中定义的那个,但我相信还有其他数据库系统与sql相同服务器).
如果您正在使用支持筛选索引的sql Server版本,则可以应用以下其中一个:
CREATE UNIQUE INDEX IX_T ON [Table] ([Column]) WHERE [Column] IS NOT NULL
(但请注意,此索引不能成为FK约束的目标)
它的“为什么”真正归结为,它就是很久以前的实施方式(可能是预标准),而现在改变它的那些尴尬局面之一可能会破坏很多现有系统.
Re:外键 – 如果不是因为外键列中的NULL值导致不检查外键这一事实你会是正确的 – 没有办法(在sql Server中)使用NULL作为实际键.