본문 바로가기

db/oracle

ORA-02291: 무결성 제약 조건 (외래 키) 위반 (Integrity Constraint (Foreign Key) Violated)

반응형

ORA-02291: 무결성 제약 조건 (외래 키) 위반, Integrity Constraint (Foreign Key) Violated

 

ORA-02291 오류는 오라클 데이터베이스에서 발생하는 오류 중 하나로, 외래 키 제약 조건과 관련된 문제입니다. 이 오류는 자식 테이블에 데이터를 삽입하거나 갱신하려고 할 때, 부모 테이블에 해당 외래 키 값이 존재하지 않을 경우 발생합니다. 즉, 데이터의 무결성을 유지하기 위한 제약 조건에 위배되는 상황인 것입니다.

 

ORA-02291 오류의 주요 원인
  • 외래 키 값 불일치 : 자식 테이블에 삽입하려는 외래 키 값이 부모 테이블의 기본 키 값과 일치하지 않을 때 발생합니다. 예를 들어, '주문' 테이블의 '고객 ID' 외래 키는 '고객' 테이블의 '고객 ID' 기본 키를 참조합니다. 만약 '주문' 테이블에 존재하지 않는 '고객 ID'로 주문을 추가하려고 하면 ORA-02291 오류가 발생합니다.
    부모 테이블의 데이터 삭제 : 자식 테이블에서 참조하고 있는 부모 테이블의 데이터를 삭제한 경우에도 발생할 수 있습니다. 예를 들어, 위와 같은 상황에서 '주문' 테이블에서 특정 고객의 주문이 존재하는 상황에서 해당 고객의 정보를 '고객' 테이블에서 삭제하면, '주문' 테이블의 외래 키가 유효하지 않게 되어 오류가 발생할 수 있습니다.
    ORA-02291 오류 해결 방법
  • 외래 키 값 확인 : 삽입 또는 갱신하려는 외래 키 값이 부모 테이블의 기본 키 값과 일치하는지 확인해야 합니다. 데이터 입력 시 오타나 잘못된 값이 입력되었는지 확인하고, 필요한 경우 부모 테이블에서 올바른 키 값을 확인하여 수정해야 합니다.
  • 부모 테이블 데이터 확인 : 부모 테이블에 필요한 데이터가 존재하는지 확인해야 합니다. 만약 부모 테이블에 데이터가 없다면, 먼저 부모 테이블에 데이터를 추가한 후 자식 테이블에 데이터를 추가해야 합니다.
  • 데이터 정합성 유지 : 부모 테이블의 데이터를 삭제하기 전에 자식 테이블에서 해당 데이터를 참조하고 있는지 확인해야 합니다. 만약 참조하고 있다면, 자식 테이블의 데이터를 먼저 삭제하거나 외래 키 설정을 변경하여 부모 테이블의 삭제가 가능하도록 조치를 취해야 합니다. 일반적으로 ON DELETE CASCADE 옵션을 사용하여 부모 테이블의 데이터가 삭제될 때 자식 테이블의 관련 데이터도 함께 삭제되도록 설정할 수 있습니다. 또는 ON DELETE SET NULL 옵션을 사용하여 부모 테이블의 데이터가 삭제될 때 자식 테이블의 외래 키 값을 NULL로 설정할 수도 있습니다.
  • 트랜잭션 관리 : 여러 테이블에 데이터를 삽입/삭제/갱신하는 작업을 수행할 경우 트랜잭션을 사용하여 데이터의 정합성을 보장해야 합니다. 트랜잭션을 사용하면 작업 도중 오류가 발생했을 때 모든 변경 사항을 롤백하여 데이터의 무결성을 유지할 수 있습니다.
예시

[부서] 테이블과 [사원] 테이블이 있습니다. [사원] 테이블의 "부서 ID"는 [부서] 테이블의 "부서 ID"를 참조하는 외래 키입니다.

 -- 부서 테이블
CREATE TABLE 부서 (
    부서_ID NUMBER PRIMARY KEY,
    부서명 VARCHAR2(50)
);

-- 사원 테이블
CREATE TABLE 사원 (
    사원_ID NUMBER PRIMARY KEY,
    사원명 VARCHAR2(50),
    부서_ID NUMBER REFERENCES 부서(부서_ID)
);

-- 부서 테이블에 데이터 삽입
INSERT INTO 부서 (부서_ID, 부서명) VALUES (10, '개발부');

-- 사원 테이블에 데이터 삽입 (정상)
INSERT INTO 사원 (사원_ID, 사원명, 부서_ID) VALUES (100, '김철수', 10);

-- 사원 테이블에 데이터 삽입 (ORA-02291 오류 발생)
INSERT INTO 사원 (사원_ID, 사원명, 부서_ID) VALUES (101, '이영희', 20); -- 부서 ID 20은 부서 테이블에 존재하지 않음

위의 예시에서 마지막 INSERT 문은 ORA-02291 오류를 발생시킵니다. "부서 ID"가 20인 부서가 [부서] 테이블에 존재하지 않기 때문입니다.

※ ORA-02291 오류는 데이터베이스의 무결성을 유지하기 위한 중요한 제약 조건에 의해 발생하는 오류이므로, 위에서 설명한 해결 방법을 참고하여 문제를 해결하고 데이터의 정합성을 유지하는 것이 중요합니다.

반응형