
ORA-02292: integrity constraint (제약조건 이름) violated - child record found
Oracle 데이터베이스에서 데이터를 삭제하려 할 때 ORA-02292 오류가 발생한다면, 이는 해당 레코드가 다른 테이블의 외래 키(Foreign Key)로 참조되고 있기 때문입니다. 이 오류는 데이터 무결성을 보장하기 위한 Oracle의 방어적 장치로서, 삭제될 부모 레코드를 참조하는 자식 레코드가 존재할 때 발생합니다. 본 글은 ORA-02292 오류의 정확한 발생 배경과 다양한 실무 해결책, 그리고 시스템 설계 단계에서 이 오류를 예방할 수 있는 전략까지 상세히 소개합니다.
1. ORA-02292 오류란?
이 오류는 다음과 같은 상황에서 발생합니다:
DELETE FROM customers WHERE customer_id = 101;
위와 같이 고객 데이터를 삭제하려고 할 때, 해당 고객을 참조하고 있는 주문 데이터가 orders 테이블에 존재하면 ORA-02292 오류가 발생합니다.
즉, 외래 키 제약조건으로 인해 삭제가 거부된 것입니다.
2. 개념 비교: ORA-02291 vs ORA-02292
| 오류 코드 | 오류 내용 | 발생 시점 |
|---|---|---|
| ORA-02291 | 부모 키 없음 → 자식 레코드 삽입 실패 | INSERT 또는 UPDATE |
| ORA-02292 | 자식 레코드 존재 → 부모 레코드 삭제 실패 | DELETE |
ORA-02291이 '없는 부모를 참조하려 했을 때'의 오류라면, ORA-02292는 '자식이 존재해서 부모를 삭제할 수 없을 때'의 오류입니다.
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)
);
이 경우, orders 테이블은 customers 테이블의 customer_id를 참조합니다. 고객을 삭제하려면, 먼저 그 고객을 참조하는 모든 주문 레코드를 제거해야 합니다.
4. 실무 발생 사례
문제 상황: 한 쇼핑몰 플랫폼에서 고객 탈퇴 기능을 구현하던 중, 특정 고객에 대한 DELETE 쿼리가 지속적으로 실패함. 로그에는 다음과 같은 메시지가 출력됨:
ORA-02292: integrity constraint (SHOP.FK_CUSTOMER) violated - child record found
분석 결과:
orders테이블에서 해당 고객의 주문 이력이 존재- ON DELETE CASCADE 미적용 상태
해결 방법:
- 해당 고객의 주문 레코드 먼저 삭제
- 또는 제약조건을 재정의하여
ON DELETE CASCADE적용
5. 오류 해결 전략
| 전략 | 설명 | 주의사항 |
|---|---|---|
| 자식 테이블 먼저 삭제 | 참조 중인 레코드를 수동 삭제 | 삭제 대상 식별을 정확히 해야 함 |
| ON DELETE CASCADE 적용 | 부모 삭제 시 자식도 자동 삭제 | 의도하지 않은 대량 삭제 가능성 있음 |
| 제약조건 일시 제거 | 외래 키 제약조건 DROP 후 삭제 | 무결성 훼손 위험 존재 |
| 논리 삭제 처리 | 실제 삭제 대신 상태값만 변경 | 데이터는 남아 있으므로 용량 고려 필요 |
6. 실전 SQL 예시
자식 레코드 존재 여부 확인
SELECT * FROM orders WHERE customer_id = 101;
ON DELETE CASCADE 적용 예
ALTER TABLE orders
DROP CONSTRAINT fk_customer;
ALTER TABLE orders
ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id)
REFERENCES customers(customer_id) ON DELETE CASCADE;
논리 삭제 예시
UPDATE customers
SET active_flag = 'N'
WHERE customer_id = 101;
7. 실무 예방 팁
- 자식 레코드를 갖는 테이블에 DELETE를 허용하는 경우 항상 외래 키 정의를 명확히 검토
- 논리 삭제 정책을 통해 물리적 삭제를 최소화
- 외래 키 제약조건에 ON DELETE SET NULL 또는 CASCADE 옵션 적용 여부 검토
- 삭제 전
EXISTS또는JOIN을 통해 참조 여부 사전 체크
8. 결론
ORA-02292 오류는 오라클이 데이터 무결성을 보장하기 위해 의도적으로 설계한 보호장치입니다. 자식 테이블의 존재 여부를 무시하고 부모 데이터를 삭제하면 데이터 관계가 훼손되기 때문에, 시스템 설계 및 운영에서 반드시 사전에 이러한 오류 가능성을 고려해야 합니다. 이 글에서 제시한 실무 중심의 해결 전략과 예방 노하우는 향후 ORA-02292 오류 발생 시 신속하고 안전하게 대응할 수 있도록 도와줄 것입니다.
출처
- Oracle® Database Concepts 19c
- Oracle SQL Language Reference
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] ORA-00054 오류 완전 정복 : 리소스 잠금으로 인한 DDL 실패의 근본 원인과 실무 대응 전략 (0) | 2025.07.28 |
|---|---|
| [ORACLE] ORA-00060 오류 완전 분석 : 데드락 감지와 회피 전략 (0) | 2025.07.28 |
| [ORACLE] ORA-00020 오류 해결 가이드 : 세션 수 초과의 원인과 진단 전략 (0) | 2025.07.28 |
| [ORACLE] ORA-28040 오류 해결 : 프로토콜 불일치로 인한 인증 실패의 원인과 대책 (0) | 2025.07.28 |
| [ORACLE] ORA-02291 오류 해결 가이드: 무결성 제약 조건 위반의 진짜 원인과 실전 대응 (0) | 2025.07.28 |