Oracle Unique Index to Non-Unique Index (Primary Key to Non-unique Index)

기본키 제약조건을 없애야 하는 상황이 생겼습니다. 무결성을 위한 제약이 오히려 장애가 되어 정리하기로 하였습니다. 다음의 과정을 따라해 주십시오.

Oracle Unique Index to Non-Unique Index
--PCTFREE, INITRANS, MAXTRANS 등은 유연하게 적용해 주세요~
-- 기본키 삭제

ALTER TABLE TableName DROP PRIMARY KEY CASCADE;

-- 인덱스 삭제

DROP INDEX IndexNameToDrop; 

-- 대체 인덱스 생성(non unique)

CREATE INDEX IndexNameToCreate
   ON TableName (ColName1, ColName2, ColNameN)
   LOGGING
   TABLESPACE TablespaceName
   PCTFREE 10
   INITRANS 2
   MAXTRANS 255
   STORAGE (INITIAL 64 M
            NEXT 1 M
            MINEXTENTS 1
            MAXEXTENTS UNLIMITED
            PCTINCREASE 0
            BUFFER_POOL DEFAULT)
   NOPARALLEL;

-- PK가 없어지면서 NULL이 허용되는 현상 방지

ALTER TABLE TableName MODIFY (
    ColName1 NOT NULL,
    ColName1 NOT NULL,
    ColNameN NOT NULL);

유니크 인덱스를 논유니크 인덱스로 변경하는 별도의 방법은 없습니다. 그리하여 필요 시 기존 유니크 인덱스에 대한 드랍을 진행하고 논유니크 인덱스 추가작업을 진행해야 합니다.

예시자료는 유니크 인덱스를 추가하였으나, 유니크가 적합하지 않아서 논유니크 인덱스로 변경해야 하는 상황입니다. 다음은 예시 유니크 인덱스입니다.

CREATE UNIQUE INDEX USERNAME.UNIQUEINDEXNAME
   ON USERNAME.TABLENAME (C);

Unique Index to Non-Unique Index

유니크 인덱스 드랍, 인덱스 생성을 진행합니다.

--유니크 인덱스 드랍
DROP INDEX UNIQUEINDEXNAME;

--논유니크 인덱스 생성
CREATE INDEX USERNAME.NONUNIQUEINDEXNAME
   ON USERNAME.TABLENAME (C);

드랍하지 않고 바로 진행을 시도하는 경우에는 다음과 같은 오류가 발생할 수 있습니다.

ORA-01408: 열 목록에는 이미 인덱스가 작성되어 있습니다

ORA-01408: such column list already indexed

반대로 논유니크 인덱스의 컬럼에 대해 중복 컬럼이 존재할 때, 유니크 인덱스를 설정하는 경우 다음과 같은 오류가 발생합니다. 이 경우, 인덱스 대상 컬럼의 중복 레코드를 정리하여야 합니다.

ORA-01452: 중복 키가 있습니다. 유일한 인덱스를 작성할 수 없습니다

ORA-01452: cannot create unique index duplicate keys found

댓글