一尘不染

SQLite的NULL和唯一的?

sql

我注意到在具有UNIQUE约束的列中可以有NULL值: UNIQUE(col)

在某些情况下会产生任何问题吗?


阅读 172

收藏
2021-03-10

共1个答案

一尘不染

尽管以下内容解决了多个空值,但除了可能的数据库/ SQL可移植性之外,它 没有 解决与这种设计相关的任何“问题”,因此,它可能
应该被视为答案,在此仅作参考。


这实际上在SQLite常见问题解答中进行了介绍。这是一种设计选择-SQLite(与SQL Server不同)选择了多个NULL值 计入索引的唯一性。

SQL标准要求即使约束中的一个或多个列为NULL,也必须强制执行UNIQUE约束,但是SQLite不会这样做。那不是错误吗?

也许您是指SQL92中的以下语句:

  • 当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束。

该声明含糊不清,至少有两种可能的解释:

  1. 当且仅当表中没有两行具有相同的值且唯一列中具有非空值时,才满足唯一约束。

  2. 当且仅当表中没有两行在不为null的唯一列的子集中具有相同的值时,才满足唯一约束。

SQLite遵循解释(1),PostgreSQL,MySQL,Oracle和Firebird也是如此。Informix和Microsoft SQL
Server确实使用了解释(2),但是我们SQLite开发人员认为解释(1)是对该要求的最自然的解读,我们还希望最大程度地与其他SQL数据库引擎以及大多数其他数据库引擎兼容。数据库引擎也与(1)一起使用,因此SQLite就是这样做的。

请参见NULL处理比较

2021-03-10