PostgreSQL中如何为指定status_id值创建唯一复合索引
实现PostgreSQL条件唯一复合索引(仅约束status_id为1/3时的document+status_id唯一性)
正确SQL语句
CREATE UNIQUE INDEX accounts_document_status_unique ON "Accounts" (document, status_id) WHERE status_id IN (1, 3);
原写法问题说明
- 第一个语句仅针对
status_id = 1做约束,未覆盖需求中的status_id = 3场景,且索引名使用了关键字index(虽PostgreSQL允许加引号,但不推荐)。 - 第二个语句未添加
UNIQUE关键字,仅创建了普通部分索引,不会对记录唯一性做校验,因此可以重复插入符合条件的记录。
约束效果验证
- 插入记录
(1, name_1, 1, 1234):合法,无重复约束冲突 - 插入记录
(1, name_1, 2, 1234):合法,status_id不在约束范围内 - 重复插入
(1, name_1, 1, 1234):触发唯一索引约束错误,符合预期 - 插入
(1, name_1, 3, 1234)(若已有同document+status_id=3的记录):触发唯一索引约束错误,符合预期 - 插入记录
(1, name_1, 4, 1234):合法,status_id不在约束范围内
内容的提问来源于stack exchange,提问作者Andersonfrfilho
相关产品推荐
相关产品推荐

