Postgreql: 有条件的唯一约束

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

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

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

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

75141 次浏览

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 唯一索引

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

有一种使用 排除限制实现它的方法,(感谢@dukelion 提供这个解决方案)

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

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