具有空值的唯一约束作为有效行

时间:2018-11-17 13:47:29

标签: sql postgresql psql

嗨,我要在批处理过程中插入一堆数据。

最终输出应该是这样的表。观察到这里的Name, Address_id对是唯一的。 Address_id可以为NULL,但对于给定的一对Name, Address_id

只能为NULL
Name    address_id
———      —————
“Richard”   1
“Richard”   2
“Richard”   NULL
“Richard    3
“James”     1
“James”     2
“James”     NULL
“James”     3

但是,当address_id为NULL时,我不能保证该对的唯一性。如果我添加一个(“Richard”, NULL)

,则另一对INDEX UNIQUE (name, address_id)被认为是有效的

然后,如果我添加以下索引(发现它在谷歌搜索)

CREATE UNIQUE INDEX index_employers_on_name_and_address_id 
    ON employers(name, address_id) 
    WHERE address_id IS NOT NULL


CREATE UNIQUE INDEX index_employers_on_name 
    ON employers(name) 
    WHERE address_id IS NULL 

不允许所有(<NAME>, NULL)对,因为已经存在一个唯一的NAME

一些想法?

1 个答案:

答案 0 :(得分:2)

此索引:

CREATE UNIQUE INDEX index_employers_on_name 
    ON employers(name) 
    WHERE address_id IS NULL ;

部分索引,仅在address_id is null时适用。每个NULL仅允许一个name值。 NULL的非address_id值对唯一性没有影响。

这似乎可以满足您的要求。