违反 - 未找到父键错误

Posted

技术标签:

【中文标题】违反 - 未找到父键错误【英文标题】:violated - parent key not found error 【发布时间】:2012-11-22 18:23:34 【问题描述】:

出现以下错误:

INSERT INTO GroupMembers VALUES ('Goldfrat', 'Simon Palm')
*
ERROR at line 1:
ORA-02291: integrity constraint (SHAHA1.IAM_IS_GROUP_FK) violated - parent key 
not found 

GroupMembers表中的约束是:

CONSTRAINT  iam_is_group_fk FOREIGN KEY(is_group) REFERENCES Members(group_name)

成员表如下所示:

CREATE TABLE Members (
  group_name  VARCHAR2(40),
  CONSTRAINT  g_id_pk PRIMARY KEY(group_name),
  CONSTRAINT  m_group_name_fk FOREIGN KEY(group_name) REFERENCES Artist(artistic_name));

在创建GroupMembers 表之前,所有表都可以正常创建。有人有想法么?我已经抓了好久了。

【问题讨论】:

我也在寻找错误。我已经禁用了外部约束并做了一些插入和删除操作。更新后,我无法启用此外部约束。它说 ORA-02298: cannot validate (PRODUSR.SYS_C0037867) - parent keys not found。但是我检查了很多次,仍然找不到任何不在父表中的记录。 【参考方案1】:

问题是

CONSTRAINT iam_is_group_fk FOREIGN KEY(is_group) REFERENCES Members(group_name); references the table Members on the group_name field.

这意味着表GroupMembers 上的字段is_group 在表Membersgroup_name 字段上必须具有相同的值。

在我看来,这是不好的做法。 首先,您应该在 GroupMembers 表上有一个主键字段。您不应将组成员的名称存储在 GroupMembers 表中,而应将其对应的 id 从表 Members 中存储。

还有成员表,应该是这样的:

    CREATE TABLE Members (
    member_id   NUMBER PRIMARY KEY
    member_name  VARCHAR2(40),
    CONSTRAINT  g_id_pk PRIMARY KEY(member_id),
    CONSTRAINT  m_group_name_fk FOREIGN KEY(group_name) REFERENCES Artist(artistic_name));

然后在桌子上GroupMembers,我想你想将一些成员关联到他们的组集并返回,所以你应该这样做:

    CREATE TABLE GroupMembers (
        member_id   NUMBER,
        group_id    NUMBER
    )
    CONSTRAINT  iam_is_member_fk FOREIGN KEY(member_id) REFERENCES Members(member_id);
    CONSTRAINT  iam_is_member_fk FOREIGN KEY(group_id) REFERENCES Groups(group_id);

假设您有一个表 Groups 包含所有组详细信息,primary key 存储为 number 和名称 group_id

永远记住每个表必须有一个primary key。这个键最好是一个数字。

因此,通过在Members 中添加member_id,在Groups 中添加group_id,您可以在GroupMembers 中创建多对多关系。另外,在这个表上放置一个唯一索引,这样你就不会有重复(同一个成员多次关联到同一个 id)。

看看这个将用户链接到角色的例子。这是相同的情况:

【讨论】:

【参考方案2】:

错误是 您必须使用在参考表中定义的相同列名

CONSTRAINT m_group_name_fk FOREIGN KEY(group_name) REFERENCES Artist(group_name)

group_name 应该在Artist 表中定义为primary key

【讨论】:

不,你没有,看看接受的答案。此外,请在您的答案中使用代码块。【参考方案3】:

您插入的顺序是错误的原因。

Members(group_name) 不包含Goldfrat。如果这不是真的,那么它不在表中Artists

【讨论】:

我在插入其他所有内容后插入该行

以上是关于违反 - 未找到父键错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL ORA-02291: 违反完整性约束 - 未找到父键

ORA-02291: 违反完整性约束 (PRUEBA4.AUTO_MARCA_FK) - 未找到父键

ORA-02298 未找到父键?

在每列的过程中提高父键完整性约束

ORA-02291: 违反完整约束条件 - 未找到父项关键字

SQL JDBC:未找到父键,但父值已插入数据库