db/oracle

ORA-02292: 무결성 제약 조건 (자식 레코드 발견) 위반 (Integrity Constraint (Child Record Found) Violated)

strange-dev 2025. 1. 9. 22:41
반응형

ORA-02292: 무결성 제약 조건 (자식 레코드 발견) 위반 

(Integrity Constraint (Child Record Found) Violated) 

 

ORA-02292 오류는 오라클 데이터베이스에서 발생하는 오류 중 하나로, "무결성 제약 조건 위반 - 자식 레코드가 발견되었습니다(integrity constraint violated - child record found)"라는 의미입니다. 이 오류는 부모 테이블의 행을 삭제하려고 할 때, 해당 행을 참조하는 자식 테이블의 행이 존재할 경우 발생합니다. 즉, 외래 키 제약 조건으로 인해 삭제가 거부되는 상황입니다. 데이터의 무결성을 유지하기 위한 오라클의 안전장치라고 볼 수 있습니다.

 

ORA-02292 오류의 발생 원인
  • 외래 키 제약 조건 : 자식 테이블의 외래 키가 부모 테이블의 기본 키를 참조하고 있을 때, 부모 테이블의 행을 삭제하려고 하면 해당 행을 참조하는 자식 행이 있는지 확인합니다. 만약 자식 행이 존재한다면 ORA-02292 오류가 발생합니다.
ORA-02292 오류 해결 방법
  • ORA-02292 오류를 해결하는 방법은 크게 세 가지입니다. 상황에 따라 적절한 방법을 선택해야 합니다.

 

1. 자식 테이블의 데이터 먼저 삭제 : 가장 일반적인 해결 방법은 부모 테이블의 행을 삭제하기 전에 해당 행을 참조하는 자식 테이블의 행을 먼저 삭제하는 것입니다.
어떤 자식 테이블이 문제를 일으키는지 확인하기 위해 다음 쿼리를 사용할 수 있습니다. 이 쿼리를 통해 외래 키 제약 조건의 이름을 알 수 있습니다. 이 이름을 사용하여 어떤 자식 테이블이 관련되어 있는지 확인할 수 있습니다.

SELECT constraint_name
FROM user_constraints
WHERE table_name = '삭제하려는 부모 테이블 이름'
  AND constraint_type = 'R'; -- R은 외래 키 제약 조건을 의미
  • 자식 테이블의 데이터를 삭제하는 방법은 다음과 같습니다.
DELETE FROM 자식 테이블 이름
WHERE 외래 키 컬럼 = '삭제하려는 부모 테이블 행의 기본 키 값';
  • 모든 자식 행을 삭제했다면, 이제 부모 테이블의 행을 삭제할 수 있습니다.

 

2. 외래 키 제약 조건 변경 (ON DELETE CASCADE 사용) : 외래 키 제약 조건을 생성할 때 ON DELETE CASCADE 옵션을 추가하면, 부모 테이블의 행이 삭제될 때 해당 행을 참조하는 자식 테이블의 행도 자동으로 함께 삭제됩니다. 이 방법은 부모-자식 관계가 명확하고, 부모 행 삭제 시 자식 행도 함께 삭제하는 것이 논리적으로 타당한 경우에 유용합니다.

  • 기존 외래 키 제약 조건을 삭제합니다.
ALTER TABLE 자식 테이블 이름
DROP CONSTRAINT 외래 키 제약 조건 이름;
  • ON DELETE CASCADE 옵션을 포함하여 외래 키 제약 조건을 다시 생성합니다.
ALTER TABLE 자식 테이블 이름
ADD CONSTRAINT 외래 키 제약 조건 이름
FOREIGN KEY (외래 키 컬럼)
REFERENCES 부모 테이블 이름 (기본 키 컬럼)
ON DELETE CASCADE;

 

3. 외래 키 제약 조건 변경 (ON DELETE SET NULL 사용) : ON DELETE SET NULL 옵션을 사용하면, 부모 테이블의 행이 삭제될 때 해당 행을 참조하는 자식 테이블의 외래 키 값이 NULL로 설정됩니다. 이 방법은 자식 행이 존재해야 하지만, 더 이상 부모 행을 참조할 필요가 없을 때 유용합니다. 단, 외래 키 컬럼이 NOT NULL 제약 조건이 없어야 합니다.

  • 기존 외래 키 제약 조건을 삭제합니다. (위와 동일)
  • ON DELETE SET NULL 옵션을 포함하여 외래 키 제약 조건을 다시 생성합니다. 
ALTER TABLE 자식 테이블 이름
ADD CONSTRAINT 외래 키 제약 조건 이름
FOREIGN KEY (외래 키 컬럼)
REFERENCES 부모 테이블 이름 (기본 키 컬럼)
ON DELETE SET 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-02292 발생)
DELETE FROM 부서 WHERE 부서_ID = 10; -- 사원 테이블에서 참조하고 있기 때문에 삭제 불가

-- 해결 방법 1: 사원 데이터 먼저 삭제
DELETE FROM 사원 WHERE 부서_ID = 10;
DELETE FROM 부서 WHERE 부서_ID = 10; -- 이제 삭제 가능

-- 해결 방법 2: ON DELETE CASCADE 사용 (제약 조건 수정 후)
ALTER TABLE 사원 DROP CONSTRAINT SYS_C00XXXX; -- 실제 제약 조건 이름으로 변경
ALTER TABLE 사원 ADD CONSTRAINT FK_사원_부서
FOREIGN KEY (부서_ID) REFERENCES 부서(부서_ID) ON DELETE CASCADE;
DELETE FROM 부서 WHERE 부서_ID = 10; -- 부서와 함께 사원 데이터도 자동 삭제

-- 해결 방법 3: ON DELETE SET NULL 사용 (제약 조건 수정 후)
ALTER TABLE 사원 DROP CONSTRAINT SYS_C00XXXX; -- 실제 제약 조건 이름으로 변경
ALTER TABLE 사원 ADD CONSTRAINT FK_사원_부서
FOREIGN KEY (부서_ID) REFERENCES 부서(부서_ID) ON DELETE SET NULL;
DELETE FROM 부서 WHERE 부서_ID = 10; -- 부서 삭제 후 사원 테이블의 부서 ID는 NULL로 변경

 

※ ORA-02292 오류는 데이터베이스의 무결성을 유지하기 위한 중요한 제약 조건에 의해 발생하는 오류이므로, 위에서 설명한 해결 방법을 참고하여 상황에 맞는 적절한 조치를 취해야 합니다. 특히, ON DELETE CASCADE나 ON DELETE SET NULL을 사용할 경우 데이터의 변경이 발생하므로 신중하게 고려해야 합니다.

 

 

반응형