반응형
ORA-02291 에러는 오라클 데이터베이스에서 참조 무결성 제약 조건이 위반될 때 발생합니다.
이는 자식 테이블에 삽입하려는 외래 키 값이 부모 테이블에 존재하지 않는 경우 발생합니다.
즉, 자식 테이블의 외래 키가 부모 테이블의 기본 키를 참조해야 하는데, 참조 대상이 없는 상황입니다.
에러 원인
- 중복된 데이터 입력 시도: 예를 들어, 기본 키(primary key)나 유니크 제약 조건이 걸려 있는 열(column)에 중복된 값을 삽입하려고 할 때 발생합니다.
- 잘못된 데이터 삽입 로직: 데이터 삽입 로직에서 동일한 값이 여러 번 삽입되는 경우에도 발생할 수 있습니다.
- 동시성 문제: 여러 트랜잭션이 동시에 같은 테이블에 삽입을 시도하여 중복된 데이터가 발생할 수 있습니다.
장애 예시
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
name VARCHAR2(100),
email VARCHAR2(100) UNIQUE
);
INSERT INTO employees (employee_id, name, email) VALUES (1, 'Alice', 'alice@example.com');
INSERT INTO employees (employee_id, name, email) VALUES (2, 'Bob', 'bob@example.com');
INSERT INTO employees (employee_id, name, email) VALUES (3, 'Charlie', 'alice@example.com'); -- 여기서 오류 발생
※ 위 코드에서 세 번째 INSERT 문은 email 필드에 중복된 값인 'alice@example.com'을 삽입하려 하기 때문에 ORA-00002 오류가 발생합니다.
해결 방안
1. 중복 데이터 확인 및 제거:
- 중복된 데이터가 이미 테이블에 있는 경우, 이를 확인하고 제거하는 작업이 필요합니다.
SELECT employee_id, COUNT(*)
FROM employees
GROUP BY employee_id
HAVING COUNT(*) > 1;
- 중복된 데이터가 있는 경우, 해당 데이터를 삭제하거나 업데이트하는 방법을 고려할 수 있습니다.
DELETE FROM employees
WHERE employee_id = 3; -- 중복 데이터 삭제
2. 삽입 전에 중복 여부 확인:
- 데이터를 삽입하기 전에 중복 여부를 확인하는 절차를 추가합니다.
IF NOT EXISTS (SELECT 1 FROM employees WHERE email = 'alice@example.com') THEN
INSERT INTO employees (employee_id, name, email) VALUES (3, 'Charlie', 'alice@example.com');
END IF;
3. 제약 조건 수정 (필요한 경우):
- 특정 필드에 대한 고유 제약 조건을 제거하거나 수정할 수 있습니다. 그러나 이는 데이터베이스 설계에 큰 영향을 미칠 수 있으므로 신중하게 고려해야 합니다.
ALTER TABLE employees DROP CONSTRAINT unique_email;
4. 동시성 문제 해결:
- 동시성 문제로 인해 발생한 경우, 트랜잭션 관리나 잠금 메커니즘을 통해 문제를 해결할 수 있습니다
BEGIN
LOCK TABLE employees IN EXCLUSIVE MODE;
INSERT INTO employees (employee_id, name, email) VALUES (3, 'Charlie', 'alice@example.com');
COMMIT;
END;
요약
ORA-00002 오류는 주로 고유 제약 조건을 위반하는 중복된 데이터 삽입 시 발생합니다.
1. 이를 해결하기 위해서는 중복 데이터를 제거
2. 삽입 전에 중복 여부를 확인
3. 동시성 문제를 해결하기 위한 트랜잭션 관리
반응형