Postgresql:有条件的唯一约束

时间:2013-04-26 12:22:41

标签: postgresql constraints unique-constraint

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

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

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

任何方式这样做?或者我应该回到关系绘图板?

2 个答案:

答案 0 :(得分:125)

PostgreSQL没有定义部分(即条件)UNIQUE约束 - 但是,可以创建部分唯一索引。 PostgreSQL使用唯一索引来实现唯一约束,因此效果是一样的,你只是看不到information_schema中列出的constaint。

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

请参阅partial indexes

答案 1 :(得分:17)

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

  

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

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

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

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