具有多个空列的Postgres唯一键

时间:2016-02-05 21:15:08

标签: postgresql

我正在运行Postgres 9.5并尝试基于3个字段创建唯一约束。我遇到的问题是其中两列可以为空,因此看不到这些字段为NULL的行会违反唯一约束。我的目标是成为一个约束,因为我正在尝试对冲突进行更新(UPSERT)。

表结构是这样的

product_id integer not null
colour text null
size text null

我在这里找到了另一个问题,我可以按照以下方式做一些事情

create unique index idx_1 on table (product_id, colour, size) where colour is not null or size is not null;
create unique index idx_2 on table (product_id, colour, size) where colour is null or size is null;

我真的不确定这实际上是否会在where子句中有两个字段但是如何在冲突时调用这个唯一索引?

或许我应该以不同的方式处理这个问题?

1 个答案:

答案 0 :(得分:4)

如果将null视为空字符串是可以接受的,您可以尝试使用:

create unique index idx_1 on table (product_id, coalesce(colour,''), coalesce(size,''));