【问题标题】:UNIQUE constraint where NULL is one valid value [duplicate]唯一约束,其中 NULL 是一个有效值 [重复]
【发布时间】:2015-03-13 18:32:17
【问题描述】:

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,则它必须是唯一的。

【问题讨论】:

    标签: postgresql unique-constraint


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2022-01-13
      • 2020-03-27
      相关资源
      最近更新 更多