Postgres在同一个基表上的多对多关系

时间:2017-10-01 10:38:51

标签: sql postgresql

我正在尝试在postgres中的同一个基表上设置多对多的关联。

我对此查询有点困惑;特别是以下错误信息。

错误

  

错误:在表“link”上插入或更新违反外键   约束“link_primaryid_fkey”SQL状态:23503详细信息:密钥   (primaryid)=(2)在表“entity”中不存在。

我希望PrimaryId列存在于Link表中(它确实存在)。但是,错误似乎表明PrimaryId列也需要存在于基础Entity表中,这是我想要避免的。

有人能指出我正确的方向吗?

加快速度的脚本

--- Create Tables
CREATE TABLE "Entity" ("Id" SERIAL PRIMARY KEY);
CREATE TABLE "Task" ("Name" TEXT) INHERITS ("Entity");
CREATE TABLE "Project" ("Name" TEXT) INHERITS ("Entity");

--- Create mock data
INSERT INTO "Task" ("Name") VALUES ('Foo');
INSERT INTO "Project" ("Name") VALUES ('Bar');

-- Create Link Table
CREATE TABLE "Link" (
  "PrimaryId" INTEGER REFERENCES "Entity" ("Id")
                    ON UPDATE CASCADE
                    ON DELETE CASCADE,
  "SecondaryId" INTEGER REFERENCES "Entity"("Id" )
            ON UPDATE CASCADE
                    ON DELETE CASCADE,
  PRIMARY KEY ("PrimaryId", "SecondaryId")
);

--- Create Associations. It errors here
INSERT INTO "Link" ("PrimaryId", "SecondaryId") VALUES (2, 1)

更新1

更新为在任何地方使用绝对大小写("

由于

1 个答案:

答案 0 :(得分:1)

外键不能很好地继承,因为它们只能看到基表的内容,而不是继承的表。

请参阅https://www.postgresql.org/docs/9.6/static/ddl-inherit.html,具体说明:

  

继承功能的一个严重限制是索引(包括唯一约束)和外键约束仅适用于单个表,而不适用于其继承子项。在外键约束的引用和引用方面都是如此。因此,就上述例子而言:

     

(...)

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