SQL NULLs 很奇怪!

主要观点: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 的特殊情况等相关讨论链接。
阅读 3
0 条评论