SW/Database / / 2024. 9. 1. 09:27

ORA-00002 / unique constraint (constraint_name) violated / 원인과 해결 방안

반응형
ORA-02291 에러는 오라클 데이터베이스에서 참조 무결성 제약 조건이 위반될 때 발생합니다.
이는 자식 테이블에 삽입하려는 외래 키 값이 부모 테이블에 존재하지 않는 경우 발생합니다.
즉, 자식 테이블의 외래 키가 부모 테이블의 기본 키를 참조해야 하는데, 참조 대상이 없는 상황입니다.

 

ORA-00002 원인과 해결

에러 원인

 

 

  • 중복된 데이터 입력 시도: 예를 들어, 기본 키(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. 동시성 문제를 해결하기 위한 트랜잭션 관리

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유