Postgresql:有条件唯一约束



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

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

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

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

PostgreSQL没有定义部分(即条件)UNIQUE约束-然而,您可以创建部分唯一的索引

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

同样,您不会看到information_schema中列出的约束。

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

参见部分索引

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

在表中添加唯一约束的首选方法是ALTER table…添加约束。使用索引来强制惟一约束可以被视为不应该直接访问的实现细节。但是,应该注意,不需要在唯一列上手动创建索引;这样做只会复制自动创建的索引。

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

在你的例子中,它看起来像

ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);

最新更新