UNIQUE约束,其中NULL是一个有效值

时间:2015-03-13 18:32:18

标签: postgresql unique-constraint

Inn PostgreSQL我希望有一个多列UNIQUE约束,其中一列可以只为NULL一次。

到目前为止我尝试过:

ALTER TABLE customexternalemail 
ADD CONSTRAINT customexternalemail_sp_emaildomain_unique 
    UNIQUE(serviceproviderid, emailprefix, emaildomainid);

serviceprovideridemaildomainid为BIGINT,emailprefix为TEXT。 emaildomainid是唯一允许NULL的列,并且是我遇到问题的列。

基本上,我想只允许一个匹配serviceprovideridemailprefixemaildomainid组合的条目,其中emaildomainid可以是BIGINT值或NULL。目前(使用上述约束),如果emaildomainid为NULL,它将接受重复,但如果emaildomainid不为NULL,则它必须是唯一的。

1 个答案:

答案 0 :(得分:4)

您可以创建两个partial indexes。它们自2002年2月发布的version 7.2以来得到支持。

emaildomainid不为空时,这个将检查三列的任何组合是否唯一:

CREATE UNIQUE INDEX customexternalemail_sp_emaildomain_unique_not_null 
    ON customexternalemail (serviceproviderid, emailprefix, emaildomainid)
    WHERE emaildomainid IS NOT NULL;

这个将确保对于emaildomainid具有空值的任何行,组合(serviceproviderid, emailprefix)将是唯一的:

CREATE UNIQUE INDEX customexternalemail_sp_emaildomain_unique_null 
    ON customexternalemail (serviceproviderid, emailprefix)
    WHERE emaildomainid IS NULL;