
ORA-02291: integrity constraint (제약조건 이름) violated - parent key not found
Oracle에서 데이터를 삽입 또는 갱신(INSERT, UPDATE)하려 할 때 ORA-02291 오류가 발생하면, 이는 외래 키(Foreign Key) 제약 조건을 위반한 경우입니다. 흔히 '부모 키가 존재하지 않는다'는 메시지를 통해, 참조 무결성이 지켜지지 않았다는 것을 알려줍니다. 이 글에서는 ORA-02291 오류의 정확한 발생 배경, 일반적인 실수 유형, 실무에서 자주 겪는 사례와 그에 대한 대응 전략을 모두 설명합니다.
1. ORA-02291 오류란?
이 오류는 외래 키 제약조건이 정의된 자식 테이블에 데이터를 삽입하거나 수정할 때, 해당 외래 키가 참조하는 부모 테이블의 값이 존재하지 않을 경우 발생합니다.
즉, 데이터의 무결성을 유지하기 위해 Oracle이 설정한 규칙에 위배된 것입니다.
INSERT INTO orders (order_id, customer_id)
VALUES (101, 9999);
위 예제에서, customer_id가 customers 테이블에 존재하지 않으면 오류가 발생합니다.
2. 외래 키 개념 정리
외래 키(Foreign Key)는 자식 테이블이 부모 테이블의 기본 키 또는 고유 키를 참조하도록 정의하는 제약조건입니다.
| 개념 | 설명 |
|---|---|
| Primary Key | 부모 테이블의 유일한 식별자 |
| Foreign Key | 자식 테이블이 참조하는 외부 키 |
| 참조 무결성 | 부모 테이블에 존재하지 않는 값을 자식 테이블이 가질 수 없음 |
3. 오류 발생 예시
테이블 구조
CREATE TABLE customers (
customer_id NUMBER PRIMARY KEY,
name VARCHAR2(100)
);
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
customer_id NUMBER,
CONSTRAINT fk_customer FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
);
오류를 발생시키는 삽입
-- customers 테이블에 1001번 고객이 없을 경우 오류 발생
INSERT INTO orders (order_id, customer_id) VALUES (5001, 1001);
오류 메시지
ORA-02291: integrity constraint (SCHEMA.FK_CUSTOMER) violated - parent key not found
4. 주요 원인과 해결 방법 요약
| 오류 원인 | 설명 | 해결 방안 |
|---|---|---|
| 부모 테이블에 키 없음 | 참조할 값이 존재하지 않음 | 부모 테이블에 먼저 값 삽입 |
| 잘못된 참조 컬럼 | 오타 또는 타입 불일치 | 데이터 타입, 값 검토 |
| 트랜잭션 순서 문제 | 부모 삽입이 커밋되기 전 자식 삽입 시도 | 트랜잭션 순서 조정 또는 단일 트랜잭션 사용 |
| 데이터 마이그레이션 중 오류 | 순서 없이 대량 INSERT 수행 | 제약조건 비활성화 후 처리, 이후 재활성화 |
5. 실무 사례: 전자상거래 플랫폼 주문 테이블 오류
전자상거래 플랫폼에서 새 주문 데이터를 대량으로 마이그레이션하던 중 ORA-02291 오류가 연속적으로 발생했습니다. 분석 결과, 고객 정보가 아직 마이그레이션되지 않았음에도 불구하고 주문 데이터부터 먼저 INSERT가 시도된 것이 원인이었습니다.
해결 절차:
- 제약조건
fk_customer일시적으로 비활성화 - 고객 데이터 마이그레이션 선행
- 주문 데이터 마이그레이션 수행
- 제약조건 다시 활성화 후 무결성 검증
6. 오류 분석 쿼리
외래 키 제약조건을 찾고 검토하는 SQL은 다음과 같습니다:
SELECT a.table_name, a.constraint_name, a.constraint_type, b.r_constraint_name,
b.table_name AS parent_table
FROM user_constraints a
JOIN user_constraints b
ON a.r_constraint_name = b.constraint_name
WHERE a.constraint_type = 'R';
이를 통해 어떤 테이블이 어떤 부모 테이블을 참조하고 있는지를 쉽게 파악할 수 있습니다.
7. 실무 권고 사항
- 데이터 마이그레이션 시에는 데이터 삽입 순서를 고려해야 함
SET CONSTRAINTS ALL DEFERRED는 트랜잭션 단위로 유효- 가능하면 FOREIGN KEY에 ON DELETE CASCADE 또는 ON DELETE SET NULL 옵션 사용을 고려
- ETL 도구 사용 시, 부모-자식 순서 정확하게 관리 필요
8. 결론
ORA-02291 오류는 외래 키 제약조건을 올바르게 이해하지 못한 채 작업할 경우 누구나 마주칠 수 있는 대표적인 Oracle 오류입니다. 그러나 오류의 본질은 단순합니다 — 참조 대상이 존재하지 않기 때문에 참조할 수 없다는 것입니다. 이 글을 통해 오류의 발생 원리, 진단 방법, 그리고 실제 해결 전략을 익히셨다면, 앞으로는 더 빠르고 정확하게 문제를 파악하고 해결할 수 있을 것입니다.
출처
- Oracle® Database Concepts 19c
- Oracle SQL Language Reference
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] ORA-00020 오류 해결 가이드 : 세션 수 초과의 원인과 진단 전략 (0) | 2025.07.28 |
|---|---|
| [ORACLE] ORA-28040 오류 해결 : 프로토콜 불일치로 인한 인증 실패의 원인과 대책 (0) | 2025.07.28 |
| [ORACLE] ORA-12154 오류 해결 : TNS 설정부터 실전 점검까지 (0) | 2025.07.28 |
| [ORACLE] ORA-02019 : 오류 해결 가이드 - 실무에서 마주치는 복병 (0) | 2025.07.27 |
| [ORACLE] ORA-01747 : 부적절한 열 이름 오류 해결 가이드 (0) | 2025.07.27 |