반응형
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 오류는 데이터베이스의 무결성을 유지하기 위한 중요한 제약 조건에 의해 발생하는 오류이므로, 위에서 설명한 해결 방법을 참고하여 문제를 해결하고 데이터의 정합성을 유지하는 것이 중요합니다.
반응형
'db > oracle' 카테고리의 다른 글
ORA-00942: 테이블 또는 뷰가 존재하지 않음 (Table or View Does Not Exist) (0) | 2025.01.10 |
---|---|
ORA-02292: 무결성 제약 조건 (자식 레코드 발견) 위반 (Integrity Constraint (Child Record Found) Violated) (0) | 2025.01.09 |
ORA-00001: 유일성(무결성) 제약조건에 위배됩니다 (0) | 2025.01.07 |
oracle 테이블 명세서 쿼리 (1) | 2024.09.06 |
windows oracle on/off 자동 실행 (0) | 2024.06.06 |