我正在运行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子句中有两个字段但是如何在冲突时调用这个唯一索引?
或许我应该以不同的方式处理这个问题?
答案 0 :(得分:4)
如果将null视为空字符串是可以接受的,您可以尝试使用:
create unique index idx_1 on table (product_id, coalesce(colour,''), coalesce(size,''));