Inn PostgreSQL我希望有一个多列UNIQUE约束,其中一列可以只为NULL一次。
到目前为止我尝试过:
ALTER TABLE customexternalemail
ADD CONSTRAINT customexternalemail_sp_emaildomain_unique
UNIQUE(serviceproviderid, emailprefix, emaildomainid);
serviceproviderid
和emaildomainid
为BIGINT,emailprefix
为TEXT。 emaildomainid
是唯一允许NULL的列,并且是我遇到问题的列。
基本上,我想只允许一个匹配serviceproviderid
,emailprefix
和emaildomainid
组合的条目,其中emaildomainid
可以是BIGINT值或NULL。目前(使用上述约束),如果emaildomainid
为NULL,它将接受重复,但如果emaildomainid
不为NULL,则它必须是唯一的。
答案 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;