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

PostgreSQL中唯一索引与唯一约束的区别是什么?

多字段唯一约束与唯一索引的区别?

两种实现方式

方式1:唯一约束

create table t
(
    id bigserial primary key,
    val1 integer,
    val2 integer,
    unique (val1, val2)
);

方式2:唯一索引

create table t
(
    id bigserial primary key,
    val1 integer,
    val2 integer
);

create unique index unique_val1_val2
on t (val1, val2);

两者的差异说明

这两种方式在功能上高度重叠,但确实存在几个细微区别:

  • 元数据与管理方式不同
    唯一约束会被标记为表的约束条目,可在information_schema.table_constraints这类系统视图中查询到;而唯一索引仅作为索引存在,需从索引相关系统视图(比如pg_indexes)查看。修改或删除时,约束用ALTER TABLE ... DROP CONSTRAINT操作,索引则用DROP INDEX单独处理。

  • NULL值处理完全一致
    你测试的结果没问题——PostgreSQL里两者对NULL的逻辑完全相同:NULL被视为“未知”,多条(NULL, NULL)或(NULL, 固定值)的记录会被判定为重复,无法插入。这是因为PostgreSQL的唯一规则里,多个NULL会被当作重复项处理。

  • 约束支持外键参考
    唯一约束可以作为其他表外键的参考目标,唯一索引不行。如果有表需要关联t表的val1+val2组合作为外键,必须用唯一约束才能实现。

  • 索引的灵活性更高
    唯一索引支持基于表达式创建(比如create unique index on t (lower(val1), val2)),且能随时添加;唯一约束虽然也可事后添加,但默认只能基于列组合,要实现表达式唯一约束需要额外语法,不如索引直接灵活。

简单说:如果只是要保证唯一性,两者效果几乎无差;但需要约束的元数据标识、外键关联等特性时,优先选唯一约束;要做表达式类的唯一校验,就用唯一索引。

内容的提问来源于stack exchange,提问作者Rusel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:13:24