오라클 PK 인덱스 삭제 - olakeul PK indegseu sagje

[ORACLE] PK인덱스, UNIQUE인덱스, 인덱스 삭제 (DROP INDEX)

--------------------------------------------------------------------------------

ALTERTABLE WEX001MDROPPRIMARYKEYCASCADE;

DROPINDEXPK_WEX001M;

--------------------------------------------------------------------------------

ALTER TABLEWEX002DDROPPRIMARYKEYCASCADE;

DROPINDEXPK_WEX002D;

DROPINDEX IX_WEX002D_N01;

DROPINDEXIX_WEX002D_N02;

--------------------------------------------------------------------------------

[문법]

1. 인덱스 삭제

DROP INDEX [인덱스명];

2. PK인덱스 삭제

ALTER TABLE [테이블명] DROP PRIMARY KEY CASCADE;

DROP INDEX [인덱스명];

-PK인덱스 삭제의 경우, 해당 테이블에 컬럼 제약조건을 DROP 한 후에 PK인덱스 삭제가 가능하다.

[Oracle] PK(primary key), index 수정 삭제 생성 및 유의사항

오라클 PK 인덱스 삭제 - olakeul PK indegseu sagje
연수생2019. 11. 26. 13:19

-- pk, index 수정, 삭제, 생성 방법 -- 1.pk 삭제 drop INDEX pk_table_name01; -- 2.index가 남아있을 경우, index 삭제 ALTER TABLE table_name01 DROP PRIMARY KEY; commit; -- 3. 다시 pk 수정해서 생성하기. ALTER TABLE table_name01 add( CONSTRAINT pk_table_name01 PRIMARY KEY (pk_column1));

오늘의 삽질, pk를 수정하고 싶어서 지웠다가 에러를 마주했습니다.

먼저, 테이블의 (pk, fk, uk, check) 확인하는 쿼리입니다. 수정하고자 하는 테이블이 어떻게 생겨먹었는지 확인할 때 사용합니다.

select c.table_name, c.constraint_name, c.constraint_type, s.column_name from user_constraints c, user_cons_columns s where c.constraint_name = s.constraint_name and c.table_name in ('table_name01', 'table_name02') order by c.table_name ; --p(pk), r(fk), u(uk), c(not null, check)를 의미합니다.

전 아무 생각 없이 pk 수정하려면 지우고 다시 생성한다는 생각으로 지웠죠. 다음은 pk를 제거하는 쿼리입니다.

ALTER TABLE Table_name01 DROP PRIMARY KEY; -- pk 지우기

그 후, pk를 add 했는데 다음과 같은 에러가 나옵니다.

ora-00955: 기존의 객체가 이름을 사용하고 있습니다.

결론부터 말씀드리면, index가 안 지워져서 그렇습니다.

또한, 이 문제는 pk와 index를 동시에 생성했는지와 아닌지로 나뉩니다.

동시에 생성했을 경우, pk를 지우면 index도 같이 없어지지만, index 생성 후, pk를 생성한 경우 제거해도 index는 남아있게 된다.

select * from user_indexes; -- index 확인

그리고, 오라클은 기본적으로 unique를 지원하기 때문에 인덱스를 암시적으로 생성하고 있습니다.

그렇기 때문에, pk와 index를 모두 지우고 pk를 생성해주면 자동으로 인덱스가 생성되어 있는 모습을 보실 수 있습니다.

-- 완성된 pl/sql CREATE UNIQUE INDEX PK_pkname ON table_name01 ( pk_column1, pk_column2, ) TABLESPACE temp ALTER TABLE ON table_name01 ADD( CONSTRAINT PK_pkname PRIMARY KEY (pk_column1, pk_column2));

그래서 index 아예 drop 시키고 pk를 생성했습니다.,,,,

ora-02437 : (pk 명)을 검증할 수 없습니다. - 잘못된 기본 키입니다. 에러 발생

데이터 자체 이미 중복 값이 있는 것을 기본 키로 설정하려고 하니 잘못된 키라고 하는 게 당연한 건데 에러를 마주하니 멍청한 그런 기분

그래서 기본 키에 걸맞은 키값으로 설정하여 pk 수정을 완료하였습니다~!

-- 그 외, index 명 수정하기 (rename 가능) ALTER INDEX "PK_0" RENAME TO "PK_1"; -- uk 설정 ALTER TABLE KCLICK.table_name01 ADD( CONSTRAINT UK_name unique (data1));