我想添加一个约束,仅在表的一部分中强制执行列的唯一性。
ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);
上面的
WHERE
部分是一厢情愿的想法。
有什么方法可以做到这一点吗?还是我应该回到关系图板?
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);
参见部分索引。
已经说过,PG 没有定义部分(即条件)UNIQUE 约束。文档还指出,向表添加唯一约束的首选方法是
ADD CONSTRAINT
唯一索引
向表添加唯一约束的首选方法是 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制执行唯一约束可以被视为不应直接访问的实现细节。然而,人们应该意识到,没有必要在唯一列上手动创建索引;而是需要手动创建索引。这样做只会复制自动创建的索引。
有一种方法可以使用排除约束来实现它,(感谢@dukelion提供这个解决方案)
在你的情况下它看起来像
ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);