代码之家  ›  专栏  ›  技术社区  ›  Ian Mackinnon

PostgreSQL:如何限制外键的存在?

  •  2
  • Ian Mackinnon  · 技术社区  · 14 年前

    在PostgreSQL中,除了在外键上强制存在之外,最简单的方法是什么?

    例如,给定下表:

    create table "bar"
        (
        bar_id serial primary key,
        status boolean not null
        )
    
    create table "foo"
        (
        foo_id serial primary key,
        bar_id integer references "bar"
        )
    

    怎么可能 foo.bar_id bar 哪里 status 是真的吗?

    insert , update foo ; 更新 delete )所以我想知道是否有一个更方便的方法,也许纯粹使用约束。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Mark    14 年前

    您可以将bar.status作为bar表主键的一部分。然后将status作为FK to bar的一部分放在foo表上。还设置了一个foo.status必须等于true的约束。这是一种黑客攻击,但根据现实世界的背景,这可能是有意义的。

        2
  •  1
  •   OMG Ponies    14 年前

    核心方法是在foo和bar之间有一个中间/子类别表,其中包含状态为true的bar值。foo上的外键将指向中间表,但如果添加了bar值或状态更改为false,则需要在两边进行维护。。。

    另一种方法是使用触发器,因为外键没有过滤的方法。

    PostgreSQL没有具体化视图;我不确定它是否允许您指定对视图的外键引用,但如果条状态更改为false,这将意味着一个问题。。。

        3
  •  1
  •   Larry Lustig    14 年前

    这是标准SQL关系完整性不能满足实际需求的许多情况之一。例如,我希望可以创建一个针对 而不是整个列;postgresql提供部分索引,这将解决您的问题。

    没有 状态字段。建立你的FK对吧。然后,您可以创建一个视图联合bar_true和bar_false来获得完整的bar集(尽管您必须处理主键)。

        4
  •  0
  •   Kuberchaun    14 年前