155

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

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

上面的WHERE部分是一厢情愿。

有什么办法吗?还是我应该回到关系绘图板上?

4

2 回答 2

266

PostgreSQL 没有定义部分(即条件)UNIQUE约束——但是,您可以创建部分唯一索引

PostgreSQL 使用唯一索引来实现唯一约束,所以效果是一样的,但有一个重要的警告:你不能ON CONFLICT DO UPDATE像对唯一约束一样对唯一索引执行 upserts ( )。

此外,您不会看到 中列出的约束information_schema

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

请参阅部分索引

于 2013-04-26T12:32:43.793 回答
57

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

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

有一种方法可以使用Exclusion Constraints来实现它,(感谢@dukelion 提供此解决方案)

在你的情况下,它看起来像

ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);
于 2018-01-11T05:44:01.210 回答