PostgreSQL中的外键+表继承?

时间:2014-06-23 07:12:27

标签: postgresql inheritance

我有三个表:organizationorganization_teamsorg_users。此处organization_teams继承自organization。因此,假设在organizations_teams中添加了一条记录,它会将organization表格id作为idorganization_teams列的值。

org_usersid organization列上有外键。现在当我尝试在org_users中插入数据时,它给出了如下错误

insert or update on table "org_users" violates foreign key constraint "org_users_organizations"
DETAIL:  Key (org_id)=(12) is not present in table "organizations"

为什么?

3 个答案:

答案 0 :(得分:27)

它是covered in the user manual

简短版本:您可以使用外键或表继承,但不能同时使用两者。这本质上是不可能的,只是在技术上很难实现以快速,可靠的方式跨越PostgreSQL中的继承表的唯一索引。没有它,你就无法获得有用的外键。没有人能够成功地实现它,因为补丁添加支持已经被PostgreSQL接受了。

外键可以指向属于继承层次结构的表,但它只能在该表中找到完全的行。不在任何父表或子表中。要查看外键看到的行,请执行SELECT * FROM ONLY thetableONLY关键字表示"忽略继承"这就是外键查找的功能。

答案 1 :(得分:0)

我找到的唯一解决方法是:

  1. 创建函数返回触发器,用于检查是否存在某个id 在继承表中
  2. 创建约束触发器而不是FK

答案 2 :(得分:0)

完全同意@Craig Ringer,我们不能将外键与继承一起使用。

但是,如果我们确定要插入正确的数据,并且希望在org_users中使用外键,那么我们可以做一件事。

我们可以如下创建一个org_users子表,例如org_users_child(没有外键)

CREATE TABLE org_users_child () INHERITS (org_users);

现在,我们可以在此子表中插入数据。

现在,如果我们查询org_users表,便可以找到所需的结果。