我正在尝试在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
更新为在任何地方使用绝对大小写("
)
由于
答案 0 :(得分:1)
外键不能很好地继承,因为它们只能看到基表的内容,而不是继承的表。
请参阅https://www.postgresql.org/docs/9.6/static/ddl-inherit.html,具体说明:
继承功能的一个严重限制是索引(包括唯一约束)和外键约束仅适用于单个表,而不适用于其继承子项。在外键约束的引用和引用方面都是如此。因此,就上述例子而言:
(...)
- 指定另一个表的列
REFERENCES cities(name)
将允许另一个表包含城市名称,但不包含大写名称。这种情况没有好的解决方法。