Postgres约束和外键

时间:2018-09-17 05:09:19

标签: sql postgresql

是否只有在所有值都不为null时才可以强制执行约束和外键?例如,在一个多态关系中,一个对象将具有多个外键,但通常仅使用一个,因此存在冲突。如何避免这种情况?

CREATE TABLE IF NOT EXISTS acos (
    id SERIAL PRIMARY KEY,
    created_at timestamp,
    updated_at timestamp,
    owner_id varchar(64) NOT NULL,
    stack_id varchar(64) DEFAULT NULL,
    qac_id varchar(64) DEFAULT NULL,
    rights varchar(1024)[], 
)

设置了stack_id或qac_id,但从未同时设置。

以下约束条件相同:

CONSTRAINT name_owner_id UNIQUE 
            (
                name, owner_id
            )

当name或owner_id为null时,我想忽略该约束。

1 个答案:

答案 0 :(得分:2)

除非我误解了您的意思,否则PostgreSQL在默认情况下已经可以按照您想要的方式工作:

  • 您可以在UNIQUE约束中两次拥有相同的条目,只要其中之一为NULL。

  • 如果外键列为NULL,则只要您坚持使用默认的MATCH SIMPLE,就不会强制执行约束。

  • 对于诸如“两个值之一必须为NOT NULL”这样的条件,可以使用检查约束。