我可以在 PostgreSQL 中有一个父表的外键吗?

Mar*_*kov 6 postgresql inheritance

我正在使用继承,但最终遇到了问题。

如果我运行:

select count(*) from estate_properties where id = 86820;
Run Code Online (Sandbox Code Playgroud)

我得到 1。

但是当我尝试运行它时:

insert into property_images (binary_image, name, property_id) values (16779, 'IMG_0096.jpg', 86820)
Run Code Online (Sandbox Code Playgroud)

我得到:

********** 错误 **********

错误:插入或更新表“property_images”违反外键约束“property_images_property_id_fkey” SQL 状态:23503 详细信息:表“estate_properties”中不存在键 (property_id)=(86820)。

IDestate_propertiesSERIAL

注意:另一个表apartments继承自estate_properties,并在其中添加了 86820。这会有所作为吗?还有为什么我在父表中仍然有 ID,我可以从那里选择。

编辑: 更仔细地查看文档:

http://www.postgresql.org/docs/9.5/static/ddl-inherit.html

我想实现这一目标:


5.9.1. 注意事项

  • 指定另一个表的列 REFERENCES
    city (name) 将允许另一个表包含城市名称,但不包含大写名称。
    对于这种情况,没有好的解决方法。

EDIT2: 这是外键的声明:

CONSTRAINT property_images_property_id_fkey FOREIGN KEY (property_id)
      REFERENCES estate_properties (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
Run Code Online (Sandbox Code Playgroud)

Mar*_*kov 6

显然答案在这里:

PostgreSQL 中的外键 + 表继承?

外键可以指向属于继承层次结构一部分的表,但它只能准确地在该表中查找行。不在任何父表或子表中。要查看外键看到的行,请执行 SELECT * FROM ONLY thetable。ONLY 关键字的意思是“忽略继承”,这就是外键查找的作用