You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:22:25