PostgreSQL中UNIQUE、UNIQUE NOT NULL等约束的区别是什么?
PostgreSQL中UNIQUE系列约束的差异说明
先看你给出的建表示例:
CREATE TABLE cus ( customer_id SERIAL PRIMARY KEY, first VARCHAR(20) UNIQUE, third VARCHAR(20) UNIQUE NOT NULL, fourth VARCHAR(20) UNIQUE NULLS DISTINCT, fifth VARCHAR(20) UNIQUE NULLS NOT DISTINCT );
下面逐个拆解这几种约束的核心差异:
1. UNIQUE(对应first字段)
这是最基础的唯一约束,规则很明确:
- 非空值必须唯一,重复插入相同的非空内容会触发约束冲突;
- 允许插入多个
NULL值——因为SQL标准里NULL不等于任何值(包括另一个NULL),所以多条NULL不会被判定为重复。
2. UNIQUE NOT NULL(对应third字段)
本质是UNIQUE加NOT NULL的组合约束,规则是:
- 字段绝对不能为
NULL; - 所有非空值必须唯一。相当于强制字段必须有唯一的非空内容,同时解决了空值和重复值两个问题。
3. UNIQUE NULLS DISTINCT(对应fourth字段)
PostgreSQL 15版本新增的显式语法,行为和默认的UNIQUE完全一致:
- 非空值必须唯一;
- 把
NULL视为“不同的个体”,所以可以插入多个NULL。这个语法主要是为了和NULLS NOT DISTINCT形成明确对比,让代码语义更直观,避免依赖默认规则的混淆。
4. UNIQUE NULLS NOT DISTINCT(对应fifth字段)
同样是PostgreSQL 15+支持的语法,核心改变了NULL的判定逻辑:
- 非空值依然要求唯一;
- 把
NULL视为“相同的值”,所以只能插入一个NULL,再插第二个就会触发唯一约束冲突。这个规则更贴近部分开发者对“唯一”的直觉认知——认为空值也是一种特殊的重复情况。
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

