Oracle/Administration2014. 5. 6. 14:41

PK 제약조건은 생성시 사용할 수 있는 인덱스가 없는 경우 인덱스가 자동으로 생성된다.[각주:1]

 

테스트를 위해 아래와 같이 테이블을 생성하자.

-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 NUMBER);

 

아래 예제에서 t1_pk, t1_u1인덱스는 자동으로 생성된다. 이런 경우 인덱스에 대한 obj$ 테이블의 spare1 값이 0으로 표시된다. 제약조건 삭제시 인덱스도 함께 삭제된다.

-- 2-1
ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (c1);
ALTER TABLE t1 ADD CONSTRAINT t1_u1 UNIQUE (c2);

SELECT name, spare1 FROM sys.obj$ WHERE name LIKE 'T1_%';

NAME  SPARE1
----- ------
T1_PK      0
T1_U1      0

2 행이 선택되었습니다.

-- 2-2
ALTER TABLE t1 DROP CONSTRAINT t1_pk;
ALTER TABLE t1 DROP CONSTRAINT t1_u1;

SELECT name, spare1 FROM sys.obj$ WHERE name LIKE 'T1_%';

선택된 레코드가 없습니다.

 

별도로 인덱스를 생성한 경우에는 spare1 값이 6으로 표시되며 제약조건을 삭제하더라도 인덱스가 유지된다. 운영의 안정성 측면에서 별도로 인덱스를 생성하는 편이 유리하다. 

-- 3-1
CREATE UNIQUE INDEX t1_pk ON t1 (c1);
CREATE UNIQUE INDEX t1_u1 ON t1 (c2);

ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (c1) USING INDEX t1_pk;
ALTER TABLE t1 ADD CONSTRAINT t1_u1 UNIQUE (c2) USING INDEX t1_u1;

SELECT name, spare1 FROM sys.obj$ WHERE name LIKE 'T1_%';

NAME  SPARE1
----- ------
T1_PK      6
T1_U1      6

2 행이 선택되었습니다.

-- 3-2
ALTER TABLE t1 DROP CONSTRAINT t1_pk;
ALTER TABLE t1 DROP CONSTRAINT t1_u1;

SELECT name, spare1 FROM sys.obj$ WHERE name LIKE 'T1_%';

NAME  SPARE1
----- ------
T1_PK      6
T1_U1      6

2 행이 선택되었습니다.

 

제약조건 삭제시 KEEP INDEX 옵션을 사용하면 인덱스 생성 유형과 관계없이 인덱스를 유지할 수 있다. 

-- 4
ALTER TABLE t1 DROP CONSTRAINT t1_pk [KEEP INDEX | DROP INDEX];


  1. UNIQUE 제약조건도 마찬가지다. [본문으로]

'Oracle > Administration' 카테고리의 다른 글

오라클 에러 조회 함수  (0) 2018.03.04
오라클 에러 테이블  (0) 2018.03.01
INVISIBLE 칼럼  (0) 2014.05.03
NUMBER 타입 테스트  (0) 2014.03.07
세션 정보 변경  (0) 2012.06.25
Posted by 정희락_