PostgreSQL唯一约束默认允许多个NULL。用邮箱字段唯一性作例子:假设系统把邮箱设为选填,两个客户都没留邮箱,可以同时保存。已经填写的邮箱重复,仍会被拒绝。知英教育用这一个表解释三种常见需求,练习前先说明数据库和版本。

为什么两个空值能同时保存?

假设只有一个email列,使用默认的UNIQUE (email)。两行都不填写邮箱也能写入,已有a@example.com时再插入同一个地址就会失败。PostgreSQL唯一约束默认不把NULL视作相等。判断邮箱字段唯一性时,如果业务规则允许多人不填,默认唯一约束就足够。

默认唯一约束对空值及非空重复的结果
区分缺失与同一个邮箱。

只允许一条空值,或者必须填写怎么办?

从 PostgreSQL 15 起,可以按官方唯一约束语法,让空值也参与唯一性判定。已有一条空值时,再写入一条空值就会冲突。如果规则要求每人必填,可为列加NOT NULL并保留唯一约束。知英教育建议先把需求写成可重复缺失、仅允许一次缺失、禁止缺失,再选择相应做法。

使用NULLS NOT DISTINCT时的版本与插入结果
设置前核对业务需求和版本。

用复合约束时,还需核对什么?

将门店编号与邮箱组成复合键后,邮箱字段唯一性要结合完整的列组合判断;默认语义下,同门店的两条空邮箱仍可并存,完整的相同非空组合会冲突。主键同时要求唯一和非空。PostgreSQL唯一约束对空值的处理也不能直接推广给其他数据库实现。详见官方约束文档。

复合唯一键与主键对空值的检查
先看完整的字段组合。

备考可先做一组插入结果判断题,再到软考中级备考指南核对方向。也可以通过咨询入口告诉知英教育哪一种约束容易混淆。