我有三个表:organization
,organization_teams
和org_users
。此处organization_teams
继承自organization
。因此,假设在organizations_teams
中添加了一条记录,它会将organization
表格id
作为id
中organization_teams
列的值。
org_users
在id
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"
为什么?
答案 0 :(得分:27)
简短版本:您可以使用外键或表继承,但不能同时使用两者。这本质上是不可能的,只是在技术上很难实现以快速,可靠的方式跨越PostgreSQL中的继承表的唯一索引。没有它,你就无法获得有用的外键。没有人能够成功地实现它,因为补丁添加支持已经被PostgreSQL接受了。
外键可以指向属于继承层次结构的表,但它只能在该表中找到完全的行。不在任何父表或子表中。要查看外键看到的行,请执行SELECT * FROM ONLY thetable
。 ONLY
关键字表示"忽略继承"这就是外键查找的功能。
答案 1 :(得分:0)
我找到的唯一解决方法是:
答案 2 :(得分:0)
完全同意@Craig Ringer,我们不能将外键与继承一起使用。
但是,如果我们确定要插入正确的数据,并且希望在org_users中使用外键,那么我们可以做一件事。
我们可以如下创建一个org_users子表,例如org_users_child(没有外键)
CREATE TABLE org_users_child () INHERITS (org_users);
现在,我们可以在此子表中插入数据。
现在,如果我们查询org_users表,便可以找到所需的结果。