ORA-02291: 무결성 제약조건이 위배되었습니다- 부모 키가 없습니다
오라클과 같은 데이터베이스는 '무결성'을 제약조건으로 하여금 보장할 수 있습니다. 이때 제약조건을 위배하는 경우, 위배하는 종류에 따라 오류를 발생시킨답니다.
이번 주제 'ORA-02291: 무결성 제약조건이 위배되었습니다- 부모 키가 없습니다' 오류는 부모 테이블에 키가 없는 컬럼을 인서트 하려고 할 때 발생합니다.
부모키와 관련된 외래키 자료는 다음을 참고해 주세요.
외래키가 무엇인가요? 누르면 이동합니다~
간단한 예제를 보며 오류의 발생과 해결 방법에 대해 알아보도록 하겠습니다.
Insert into USER_NAME.EMP
(EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO)
Values
(9999, 'BEOMSANG', '?', TO_DATE('11/17/1996 00:00:00', 'MM/DD/YYYY HH24:MI:SS'),
5000, 0);
ERROR at line 1:
ORA-02291: integrity constraint (USER_NAME.FK_DEPTNO) violated - parent key not found
ORA-02291: integrity constraint violated - parent key not found
이 오류는 앞에서 말씀드렸듯이, FOREIGN KEY 제약 조건이 정의된 컬럼에 값을 인서트 하려고 할 때, 해당 값이 FOREIGN KEY 제약 조건에 의해 참조된 부모 테이블에 존재하지 않을 때 발생한답니다.
참고로 예제에서 말하는 무결성 제약조건 외래 키는 DEPT 테이블에 DEPTNO 컬럼이며, 인서트 하려는 '0' 값이 없어서 발생합니다.
유저 제약조건은 다음과 같은 쿼리로 확인할 수 있습니다.
SELECT *
FROM ALL_CONSTRAINTS
WHERE OWNER = 'USER_NAME' AND CONSTRAINT_NAME = 'FK_DEPTNO';
OWNER
CONSTRAINT_NAME CO TABLE_NAME SEARCH_CONDITION R_OWNER R_CONSTRAINT_NAME DELETE_RULE STATUS DEFERRABLE
DEFERRED VALIDATED GENERATED BAD RELY LAST_CHA INDEX_OWNER
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------ -- ------------------------------------------------------------ -------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------ ------------------ ---------------- ---------------------------- ------------------ -------------------------- ---------------------------- ------ -------- -------- ------------------------------------------------------------
INDEX_NAME INVALID VIEW_RELATED
------------------------------------------------------------ -------------- ----------------------------
USER_NAME
FK_DEPTNO R EMP
USER_NAME PK_DEPT NO ACTION ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED USER NAME
해당 오류를 수정하는 방법은 2가지가 있습니다. 우선 어떠한 방법으로 처리할지 확인하여야 합니다.
- 부모 키가 없어도 되는 경우
- 부모 키가 있어야 하는 경우
부모 키 불필요?
부모 키에 의한 무결성 제약조건을 삭제합니다.
ALTER TABLE TABLE_NAME DROP CONSTRAINT CONSTRAINT_NAME;
부모 키 필요?
부모 키가 필요한 경우는 다시 2가지 경우를 생각해 볼 수 있습니다.
하나는 부모 키 입력을 누락한 경우, 다른 하나는 현재 입력하는 자식 키에 대한 오타입니다.
오타 여부를 한 번 더 확인해 주시고요, 정확히 입력하였다면 부모 키가 없는 경우이므로, 무결성 제약조건이 위배되지 않도록 부모 키에 해당 컬럼 값을 먼저 추가해 주세요.
이러한 방법을 통해 ORA-02291: integrity constraint violated - parent key not found 오류를 해결할 수 있답니다!