【问题标题】:Postgres constraint and foreign keyPostgres 约束和外键
【发布时间】:2019-02-20 23:38:41
【问题描述】:

是否可以仅在所有值都不为空时强制执行约束和外键?例如,在多态关系中,一个对象会有多个外键,但通常只使用一个,因此存在违规。我怎样才能避免这种情况?

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 时,我想忽略约束。

【问题讨论】:

  • 我认为您可能想要重新设计您的数据库,以便有第二个表包含所有 NOT NULL 类型的外键列,这些外键列从您的第一个表中引用,带有 NULLable 外键关系。

标签: sql postgresql


【解决方案1】:

除非我误解了你,否则 PostgreSQL 默认已经按照你想要的方式工作了:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-22
    • 2020-04-24
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2013-07-03
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多