【问题标题】:PostgreSQL: Insert violates foreign key constraintPostgreSQL:插入违反外键约束
【发布时间】:2018-04-04 04:16:23
【问题描述】:

我正在开发一个我想使用继承的项目(参见下面的代码)

当我尝试在个人资料中插入内容时出现错误。

ERROR:  insert or update on table "profile" violates foreign key 
constraint "profile_id_fkey"
DETAIL:  Key (id)=(21) is not present in table "test".

我正在使用 PSequel 检查数据库,并且值在父级中可见。但是,我仍然可以在父项中插入重复的主键。然后插入工作。

CREATE TABLE Test ( 
ID INTEGER NOT NULL,
PRIMARY KEY (ID)
);

CREATE TABLE Testchild (
PRIMARY KEY (ID) 
) INHERITS (Test)
;


CREATE TABLE Profile (
ProfileID INTEGER NOT NULL, 
ID INT NOT NULL, 
PRIMARY KEY (ProfileID)
);

ALTER TABLE Profile
ADD FOREIGN KEY (ID) REFERENCES Test(ID);

INSERT INTO Testchild VALUES (21);

INSERT INTO Profile VALUES (1,21);

【问题讨论】:

  • 您的 FK 关系是与 Test 表,而不是与 TestChild。尝试在第一次插入中交换测试表,它会起作用
  • 感谢您的帮助!问题是,我从测试中继承了几次。我是否必须与所有孩子建立 FK 关系?
  • 关系将从一张表定义 - 一张表的配置文件 - 测试。子表不会继承它。

标签: postgresql


【解决方案1】:

来自 PostgreSQL 文档:

继承特性的一个严重限制是索引(包括唯一约束)和外键约束仅适用于单个表,而不适用于它们的继承子表。在外键约束的引用侧和被引用侧都是如此。因此,在上面的例子中:

https://www.postgresql.org/docs/9.1/static/ddl-inherit.html

所以你必须明确声明任何 FK,它们不会继承

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    相关资源
    最近更新 更多