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
相关产品推荐
相关产品推荐

