Postgresql:条件唯一约束

问题描述 投票:0回答:2

我想添加一个约束,仅在表的一部分中强制执行列的唯一性。

ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);

上面的

WHERE
部分是一厢情愿的想法。

有什么方法可以做到这一点吗?还是我应该回到关系图板?

postgresql constraints unique-constraint
2个回答
323
投票

PostgreSQL 没有定义部分(即条件)

UNIQUE
约束 - 但是,您可以创建部分唯一的索引

PostgreSQL 使用唯一索引来实现唯一约束,因此效果是相同的,但有一个重要的警告:您不能像针对唯一约束那样针对唯一索引执行更新插入 (

ON CONFLICT DO UPDATE
)。 (编辑:显然你现在可以将它与 ON CONFLICT 一起使用

此外,您不会看到

information_schema
中列出的约束。

CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is NOT null);

参见部分索引


73
投票

已经说过,PG 没有定义部分(即条件)UNIQUE 约束。文档还指出,向表添加唯一约束的首选方法是

ADD CONSTRAINT
唯一索引

向表添加唯一约束的首选方法是 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制执行唯一约束可以被视为不应直接访问的实现细节。然而,人们应该意识到,没有必要在唯一列上手动创建索引;而是需要手动创建索引。这样做只会复制自动创建的索引。

有一种方法可以使用排除约束来实现它,(感谢@dukelion提供这个解决方案)

在你的情况下它看起来像

ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);
© www.soinside.com 2019 - 2024. All rights reserved.