我注意到在具有UNIQUE约束的列中可以有NULL值: UNIQUE(col)
UNIQUE(col)
在某些情况下会产生任何问题吗?
尽管以下内容解决了多个空值,但除了可能的数据库/ SQL可移植性之外,它 没有 解决与这种设计相关的任何“问题”,因此,它可能 不 应该被视为答案,在此仅作参考。
这实际上在SQLite常见问题解答中进行了介绍。这是一种设计选择-SQLite(与SQL Server不同)选择了多个NULL值 不 计入索引的唯一性。
SQL标准要求即使约束中的一个或多个列为NULL,也必须强制执行UNIQUE约束,但是SQLite不会这样做。那不是错误吗?
也许您是指SQL92中的以下语句: 当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束。 该声明含糊不清,至少有两种可能的解释: 当且仅当表中没有两行具有相同的值且唯一列中具有非空值时,才满足唯一约束。 当且仅当表中没有两行在不为null的唯一列的子集中具有相同的值时,才满足唯一约束。 SQLite遵循解释(1),PostgreSQL,MySQL,Oracle和Firebird也是如此。Informix和Microsoft SQL Server确实使用了解释(2),但是我们SQLite开发人员认为解释(1)是对该要求的最自然的解读,我们还希望最大程度地与其他SQL数据库引擎以及大多数其他数据库引擎兼容。数据库引擎也与(1)一起使用,因此SQLite就是这样做的。
也许您是指SQL92中的以下语句:
该声明含糊不清,至少有两种可能的解释:
当且仅当表中没有两行具有相同的值且唯一列中具有非空值时,才满足唯一约束。
当且仅当表中没有两行在不为null的唯一列的子集中具有相同的值时,才满足唯一约束。
SQLite遵循解释(1),PostgreSQL,MySQL,Oracle和Firebird也是如此。Informix和Microsoft SQL Server确实使用了解释(2),但是我们SQLite开发人员认为解释(1)是对该要求的最自然的解读,我们还希望最大程度地与其他SQL数据库引擎以及大多数其他数据库引擎兼容。数据库引擎也与(1)一起使用,因此SQLite就是这样做的。
请参见NULL处理的比较。