ORA-02291父键未找到报错,EMP表插入数据失败求解
报错信息翻译:错误代码:ORA-02291:完整性约束(SQL_OZPTHTLYAAVUSNISLXUTJKQNF.SUPERVISOR)违反 - 父键未找到 ORA-06512:位于 "SYS.DBMS_SQL" 第1721行
问题根因
你定义的SUPERVISOR是EMP表的自引用外键约束,规则为:EMP表中每条记录的MGR_ID字段值,必须已经存在于同表的EMPNO字段中。
当前你插入的是EMP表的第一条记录,填写的MGR_ID=111,但此时EMP表中没有任何EMPNO=111的记录,因此触发外键约束校验失败,抛出报错。附带的ORA-06512属于数据库内部调用堆栈信息,无实际业务排查价值,可忽略。
可行解决方案
以下3种方案按需选择:
- 方案1:调整插入顺序,先插入顶层员工
最高级员工(如CEO)无上级,可将其MGR_ID设为NULL,外键约束对NULL值不会做校验,插入成功后再插入下属员工:-- 先插入EMPNO=111的顶层员工 insert into EMP (EMPNO, ENAME, EJOB, MGR_ID, BIRTH_DATE, SAL, DEPTNO, PRJ_ID, DATE_OF_JOIN) values (111, '行政总裁', 'CEO', NULL, to_date('01-01-1970', 'dd-mm-yyyy'), 95000, 'D6', 'P1', to_date('01-01-1995', 'dd-mm-yyyy')); -- 再插入原100号员工,此时MGR_ID=111已存在,校验通过 insert into EMP (EMPNO, ENAME, EJOB, MGR_ID, BIRTH_DATE, SAL, DEPTNO, PRJ_ID, DATE_OF_JOIN) values (100, 'Ravi', 'MGR', 111, to_date('10-10-1985', 'dd-mm-yyyy'), 32000, 'D1', 'P1', to_date('02-10-2001', 'dd-mm-yyyy')); - 方案2:临时禁用约束,全量插入完成后再启用
适合已经整理完全量员工数据、不想调整插入顺序的场景:-- 临时禁用supervisor约束 alter table EMP disable constraint supervisor; -- 批量插入所有员工数据,无需考虑MGR_ID顺序 insert into EMP (EMPNO, ENAME, EJOB, MGR_ID, BIRTH_DATE, SAL, DEPTNO, PRJ_ID, DATE_OF_JOIN) values (100, 'Ravi', 'MGR', 111, to_date('10-10-1985', 'dd-mm-yyyy'), 32000, 'D1', 'P1', to_date('02-10-2001', 'dd-mm-yyyy')); insert into EMP (EMPNO, ENAME, EJOB, MGR_ID, BIRTH_DATE, SAL, DEPTNO, PRJ_ID, DATE_OF_JOIN) values (111, '行政总裁', 'CEO', NULL, to_date('01-01-1970', 'dd-mm-yyyy'), 95000, 'D6', 'P1', to_date('01-01-1995', 'dd-mm-yyyy')); -- 重新启用约束,此时所有记录的MGR_ID都已存在,校验通过 alter table EMP enable constraint supervisor; - 方案3:删除自引用约束(仅用于不需要校验上级ID合法性的场景,不推荐)
alter table EMP drop constraint supervisor;
内容的提问来源于stack exchange,提问作者Nice-Willow
相关产品推荐
相关产品推荐

