PostgreSQL,配置表约束

时间:2018-01-13 21:38:44

标签: postgresql constraints

我有表代表某些公司的配置:

id 
config_id
company_id

表中的记录表示为实例1的公司启用了实例1号的配置。如果company_id为空 - 这意味着为所有公司启用了配置。

我需要为给定的config_id创建约束,只有一条记录带有company_id = null或多个,但唯一的company_id不为空。

这样的事情无法解决问题:

CREATE UNIQUE INDEX config_unique_all_companies 
                       ON company_config_relations (config_id) 
                       WHERE company_id IS NULL

CREATE UNIQUE INDEX config_company_unique 
                       ON company_config_relations (config_id, company_id) 
                       WHERE company_id IS NOT NULL

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

CREATE UNIQUE INDEX config_unique_idx 
    ON company_config_relations (config_id, company_id)
    WHERE config_id IS NOT NULL AND company_id IS NOT NULL;
CREATE UNIQUE INDEX config_unique_companies_idx
    ON company_config_relations (company_id) 
    WHERE config_id IS NULL;
CREATE UNIQUE INDEX config_unique_default_config_idx
    ON company_config_relations (COALESCE(config_id, 0)) 
    WHERE company_id IS NULL AND config_id IS NULL;

最后一个是最有趣的一个。它创建一个只包含一个具有常量值的元素的索引。 COALESCE(config_id, 0)始终为0。这是一个创建常量索引值的技巧,因为... ON company_config_relations (0) ...将不起作用。