This question already has answers here:
Create unique constraint with null columns
(4个答案)
四年前关闭。
在PostgreSQL中,我希望有一个多列唯一约束,其中一列可以恰好为空一次。
到目前为止我所做的:
ALTER TABLE customexternalemail
ADD CONSTRAINT customexternalemail_sp_emaildomain_unique
    UNIQUE(serviceproviderid, emailprefix, emaildomainid);

其中serviceprovideridemaildomainid是BIGINT,emailprefix是TEXT。emaildomainid是唯一允许为空的列,也是我遇到问题的列。
基本上,我只允许一个条目匹配serviceprovideridemailprefixemaildomainid的组合,其中emaildomainid可以是BIGINT值或NULL。当前(具有上述约束),如果emaildomainid为空,则它将接受repeats,但如果emaildomainid不为空,则它必须是唯一的。

最佳答案

您可以创建两个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;

关于postgresql - 唯一约束,其中NULL是一个有效值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29039506/

10-11 17:26