【问题标题】:PostgreSQL Foreign Key with a condition带有条件的 PostgreSQL 外键
【发布时间】:2012-10-15 04:24:19
【问题描述】:

使用 postgres sql,有没有办法在外键上设置一个条件,它像普通外键约束一样仅限于另一个表,但也允许 0 的值存在而不存在于另一个表中。例如:

table_a:
  id

table_b:
  id
  foreign_key_on_table_a_id

table_a 将有一个事物列表,并且 table_b 与 table_a 相关,但具有外键约束。即使 table_a 中没有 0 的 id,我也希望它允许值为 0。

这是使用正确的约束吗?在不将值添加到 table_a 的情况下,是否有另一种/更好的方法?

【问题讨论】:

  • 为什么不允许引用列中的 NULL 并使用 NULL 而不是零?哨兵值通常是个坏主意。
  • 通常我会同意你的观点,但我正在与一家需要如上所述的外键约束的公司合作。相信我,如果我按照自己的方式行事,他们的工作将会彻底改革。
  • 嗯,你可以把一个 NULL 放在一个被 FKed 到另一个表的 PK 的列中。

标签: postgresql


【解决方案1】:

我会更改 foreign_key_on_table_a_id 以允许 NULL 值。然后像往常一样使用 FK 并将 NULL 放在那里而不是零。您可以在引用另一个表的列中包含 NULL。

或者,您可以编写一个函数,如果值在另一个表中,则返回 true,否则返回 false,然后添加 CHECK 约束:

CHECK (your_column = 0 or the_function(your_column))

不过,对于 FK,您不会得到任何常见的级联行为,而且这个 CHECK 是一个巨大的组合。

【讨论】:

  • 好吧,我现在感觉自己像一只傻鹅。数据库以这种方式正确设置。问题出在我的代码上。我应该将事物设置为 NULL 而不是一个不存在的值。感谢您指出我需要看的地方。
  • @Jason:听起来像是“对着墙说话”的调试技术 :) 很难看到就在你面前的东西。从好的方面来说,您不必求助于糟糕的 CHECK 组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2020-12-31
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多