ORA-02291:完整约束(SYSTEM.SYS_C007150)违规 - 未发现父母密钥

时间:2014-04-27 02:44:35

标签: sql oracle

当我创建表EMPLOYEE时,我将ESSN作为主键,SUPERSSN使用DNO作为外键来自同一个表中的外键dep表,当我想插入显示的值时,现在我很困惑。

该表包含以下内容:

 Name                                      Null?    Type
 ----------------------------------------- -------- --------------
 ENAME                                     NOT NULL VARCHAR2(30)
 ESSN                                      NOT NULL CHAR(14)
 BDATE                                              DATE
 DNO                                                NUMBER(38)
 SUPERSSN                                           CHAR(14)

我第一次使用以下命令行:

INSERT INTO EMPLOYEE ('JOSEPH','789456','14-DEC-1986','3','123');

然后我尝试没有DNO

SQL> INSERT INTO EMPLOYEE (ENAME,ESSN,BDATE)

  2  VALUES('JOSEPH','9861050560','14-DEC-1986');
-------------------------------
INSERT INTO EMPLOYEE (ENAME,ESSN,BDATE)
*
ERROR at line 1:
ORA-02291: integrity constraint (SYSTEM.SYS_C007150) violated - parent key not
found
----------------------------

3 个答案:

答案 0 :(得分:1)

父表中最有可能缺少SUPERSSN(假设)的parent_key记录。你可以通过

找到它
SELECT *
  FROM user_constraints
 WHERE table_name = 'EMPLOYEE'

因此,您需要先在employees表的父表中插入值,然后在子表中插入值。

要找出parent_table,请执行

SELECT    uc.constraint_name
         || CHR (10)
         || '('
         || ucc1.TABLE_NAME
         || '.'
         || ucc1.column_name
         || ')'
            constraint_source,
            'REFERENCES'
         || CHR (10)
         || '('
         || ucc2.TABLE_NAME
         || '.'
         || ucc2.column_name
         || ')'
            references_column
   FROM user_constraints uc, user_cons_columns ucc1, user_cons_columns ucc2
   WHERE uc.constraint_name = ucc1.constraint_name
   AND uc.r_constraint_name = ucc2.constraint_name
   AND ucc1.POSITION = ucc2.POSITION 
   AND UC.TABLE_NAME = 'EMPLOYEE'
   AND uc.constraint_type = 'R'

有关详细信息,请查看this

同时浏览thisthis

答案 1 :(得分:1)

我认为您输入的新条目(具有外键约束)是指不存在的条目

答案 2 :(得分:0)

这是一个查询,您可以用来检查外键表中的值是否存在,当然如果它们不存在则必须插入它们来解决父键违规:

SELECT E.* FROM EMPLOYEE E 
    LEFT JOIN SUPER_TABLE S
        ON E.SUPERSSN = S.SUPERSSN 
WHERE S.SUPERSSN IS NULL AND E.SUPERSSN IS NOT NULL;

当然,假设问题出在SUPERSSN键上。如果您有其他外键,那么您可能还需要检查它们。