ORA-01452: 중복 키가 있습니다. 유일한 인덱스를 작성할 수 없습니다. 오류는 오라클 데이터베이스에서 대상 컬럼 조합에 유니크 인덱스를 생성하려고 할 때에 발생합니다. 이 오류에서 말하는 중복 키는 키의 대상이 되는 컬럼 목록입니다.
ORA-01452: 중복 키가 있습니다. 유일한 인덱스를 작성할 수 없습니다. 원인
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found 오류가 발생하는 예제 자료를 하나 소개해 드리겠습니다.
SELECT * FROM TABLE_NAME;
COLUMN_NAME COLUMN_NAME_2 COLUMN_NAME_3
-------------------- -------------------- --------------------
1 1 2
1 1 9
1 2 3
해당 테이블은 상기와 같이 데이터가 있으며, 주목할 부분은 컬럼1과 컬럼2에 (1, 1) 데이터가 중복되어 있다는 것입니다.
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found 해결하기
이때, 해당 테이블의 (COLUMN_NAME, COLUMN_NAME_2) 컬럼에 유니크 인덱스를 생성하면 어떻게 될까요?
CREATE UNIQUE INDEX PK
ON TABLE_NAME (COLUMN_NAME, COLUMN_NAME_2);
ERROR at line 2:
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found
중복키가 있기에 ORA-01452 예외가 발생하게 됩니다. 해당 오류를 수정하려면 중복키를 우선 정리하여야 합니다. 중복키를 조회하는 기본적인 방법은 해당 컬럼 조합 그룹에서 카운트가 1개를 초과하는 데이터를 조회해 보는 것입니다.
SELECT COLUMN_NAME, COLUMN_NAME_2, COUNT (*)
FROM TABLE_NAME
GROUP BY COLUMN_NAME, COLUMN_NAME_2
HAVING COUNT (*) > 1;
COLUMN_NAME COLUMN_NAME_2 COUNT(*)
-------------------- -------------------- ----------
1 1 2
해당 조건을 기초로 하여, 로우아이디라든지, 생성시간을 고려해본다든지 추가 조건으로 데이터를 정리해 주세요.
무결성 데이터 정리하기 관련 팁은 블로그 검색을 활용해 주세요!
🎯 문제 해결 순서를 다시 정리해 봅시다.
🔧 ORA-01452
오류의 의미
ORA-01452: 중복 키가 있습니다. 유일한 인덱스를 작성할 수 없습니다
이 메시지는, 유일해야 할 인덱스 대상 컬럼에 중복된 데이터가 존재한다는 뜻이에요.
즉, UNIQUE INDEX
나 PRIMARY KEY
를 만들려고 하는데, 해당 컬럼 조합이 실제 데이터상 겹치는 값이 있다는 것이지요.
1. 중복 데이터 확인
중복이 생긴 컬럼 조합에 대해 먼저 중복 데이터를 찾아야 해요.
예를 들어, 다음처럼 특정 컬럼 조합의 중복을 확인합니다.
(키 컬럼을 COL1, COL2, COL3 으로 한다고 가정해요)
SELECT COL1, COL2, COL3, COUNT(*)
FROM 테이블명
GROUP BY COL1, COL2, COL3
HAVING COUNT(*) > 1;
이 결과에 행이 하나라도 있다면 중복이 있다는 뜻이에요.
중복이 있으면 절대 PRIMARY KEY를 설정하거나 UNIQUE INDEX를 만들 수 없어요.
2. 중복 제거
중복된 데이터를 삭제하거나 수정해야 해요.
예를 들어 가장 최근 데이터만 남기고 나머지를 삭제하려면 ROWID
를 활용할 수 있어요
DELETE FROM 테이블명
WHERE ROWID NOT IN (
SELECT MIN(ROWID)
FROM 테이블명
GROUP BY COL1, COL2, COL3
);
3. 인덱스 재생성 및 제약조건 설정
중복을 모두 정리한 뒤에는 아래처럼 인덱스를 만들 수 있어요
CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (COL1, COL2, COL3);
그리고 PRIMARY KEY 제약조건도 안전하게 추가할 수 있죠
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명
PRIMARY KEY (COL1, COL2, COL3)
USING INDEX 인덱스명;
🧪 이해를 돕는 예시: 오라클 EMP
테이블
EMPNO
는 직원 고유번호이기 때문에 중복이 없어야 정상이에요.
그런데 누군가 데이터 입력을 잘못해서 EMPNO = 7839
가 두 번 들어갔다고 가정해볼게요.
(기본키가 없는 것을 가정해요)
SELECT EMPNO, COUNT(*)
FROM EMP
GROUP BY EMPNO
HAVING COUNT(*) > 1;
이 쿼리에서 결과가 나온다면 중복입니다.
그러면 아래와 같이 유일 인덱스를 만들려는 시도가 실패합니다
CREATE UNIQUE INDEX PK_EMP ON EMP (EMPNO);
-- ORA-01452 발생
중복을 제거한 뒤에는 아래 인덱스 생성이 정상적으로 될 것입니다~
✅ 정리
단계 | 설명 |
---|---|
1. 중복 확인 | GROUP BY + HAVING COUNT(*) > 1 |
2. 중복 제거 | DELETE 또는 ROWID 기반 정리 |
3. 인덱스 생성 | CREATE UNIQUE INDEX |
4. 제약조건 추가 | ALTER TABLE ... ADD PRIMARY KEY |
ORA-01452
는 문법 문제가 아니라, 데이터 자체의 무결성과 관련된 문제입니다.