主要观点:SQL 对待所有 NULL 为不同值,UNIQUE 约束的列可包含多个 NULL 值,NULL 值比较特殊,不同数据库处理方式不同。
关键信息:
select null = null;
返回 NULL,因每个 NULL 是未知值,不能确定相等。select null is null;
返回 1(true),IS 操作符检查 NULL 身份。- 如创建包含
UNIQUE(email, deleted_at)
约束的表,可插入两个NULL
值的行,说明 NULL 值不同但可重复。 - 可通过创建生成列(如
_deleted_at_coalesced
),将 NULL 值设为特定值来确保唯一性,但存在删除相同记录多次时失败的缺陷。 - 使用部分索引(如
CREATE UNIQUE INDEX if not exists idx_sample_email_deleted_at ON sample(email) WHERE deleted_at IS NULL;
)可在不使表变宽的情况下确保唯一性,消耗空间少且不易出错。 - 现代数据库引擎可指定 NULL 是否不同,如
select null IS DISTINCT FROM null, null IS NOT DISTINCT FROM null;
。
重要细节: - 在不同数据库(如 SQLite、Postgres、MYSQL)中 NULL 值的处理方式相同。
- 文中通过多个代码示例展示了各种 NULL 值比较和确保唯一性的方法。
- 提到 Oracle 对待空字符串和 NULL 的特殊情况等相关讨论链接。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。