primary 생성시 질문드립니다.. 0 2 7,165

by 손님 primary key [2009.12.21 17:57:16]


초보가 질문드립니다.

먼저 테이블 XXXX 생성했구요..

create table XXXX(
aa CHAR(8) not null,
bb CHAR(8) not null,
cc CHAR(6) not null) TABLESPACE TDATA

테이블 생성은 정상인데요.
primary key 추가시 syntax 오류 떨어집니다

alter table XXXX add constraint PK_XXXX  primary key(aa, bb DESC, cc DESC) TABLESPACE TINDX

TABLESPACE TINDX 부분 지우면 생성잘되구요.
물론 TINDX 는 다른테이블에서 정상적으로 사용하는 tablespace 구요..
문법이 잘못된건가요?
alter tabl에서 key 설정시 tablespace 지정 어떻게 하나요?

 

 

by 현 [2009.12.21 18:15:05]
alter table XXXX add ( constraint PK_XXXX primary key(aa, bb DESC, cc DESC) TABLESPACE TINDX);

이렇게 한번 해보세요..


by 타락천사 [2009.12.21 21:11:20]
그 부분에서 에러가 나는게 아니구요..
PK 는 Descending으로 만들수 없습니다.
예전에 저도 궁금해서 오라클에 문의해봤는데..
원래 그렇게 못만들구 항상 Ascending 으로만 만들수 있다고 하더군요

예젠에 테스트해봤던 테스트 입니다.
결론 :
PK 에 사용되는 칼럼에 대한 인덱스는 DESC 으로는 사용할 수 없다.


-- TEST 1 ) PK LEADING COLUMN ASC / DESC TEST
PK 리딩 칼럼의 ASC / DESC 테스트
CREATE TABLE CHECK_PK ( A1 NUMBER ,A2 VARCHAR2(100)) ;

ALTER TABLE CHECK_PK DROP PRIMARY KEY ;
DROP INDEX XPK_CHECK_PK ;
CREATE UNIQUE INDEX XPK_CHECK_PK ON CHECK_PK ( A1 );
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME, DESCEND
FROM DBA_IND_COLUMNS WHERE INDEX_NAME ='XPK_CHECK_PK';
-- XPK_CHECK_PK CHECK_PK A1 ASC
ALTER TABLE CHECK_PK ADD ( CONSTRAINT XPK_CHECK_PK PRIMARY KEY ( A1 )) ;
-- Success


ALTER TABLE CHECK_PK DROP PRIMARY KEY ;
DROP INDEX XPK_CHECK_PK ;
CREATE UNIQUE INDEX XPK_CHECK_PK ON CHECK_PK ( A1 DESC );

SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME, DESCEND
FROM DBA_IND_COLUMNS WHERE INDEX_NAME ='XPK_CHECK_PK';
-- XPK_CHECK_PK CHECK_PK SYS_NC00003$ DESC
ALTER TABLE CHECK_PK ADD ( CONSTRAINT XPK_CHECK_PK PRIMARY KEY ( A1 )) ;
-- ORA-955 : NAME IS ALREADY USED BY AN EXISTING OBJECT
-- Descending Index Column 은 Primary Column 으로 사용 불가


-- TEST 1 ) PK NOT LEADING COLUMN ASC / DESC TEST
PK 리딩 아닌 칼럼의 ASC / DESC 테스트
ALTER TABLE CHECK_PK DROP PRIMARY KEY ;
DROP INDEX XPK_CHECK_PK ;
CREATE UNIQUE INDEX XPK_CHECK_PK ON CHECK_PK ( A1, A2 );
ALTER TABLE CHECK_PK ADD ( CONSTRAINT XPK_CHECK_PK PRIMARY KEY ( A1,A2 )) ;
-- Success
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME, DESCEND
FROM DBA_IND_COLUMNS WHERE INDEX_NAME ='XPK_CHECK_PK';
-- XPK_CHECK_PK CHECK_PK A1 ASC
-- XPK_CHECK_PK CHECK_PK A2 ASC

ALTER TABLE CHECK_PK DROP PRIMARY KEY ;
DROP INDEX XPK_CHECK_PK ;
CREATE UNIQUE INDEX XPK_CHECK_PK ON CHECK_PK ( A1 , A2 DESC );
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME, DESCEND
FROM DBA_IND_COLUMNS WHERE INDEX_NAME ='XPK_CHECK_PK';
-- XPK_CHECK_PK CHECK_PK SYS_NC00003$ DESC
-- XPK_CHECK_PK CHECK_PK A1 ASC
ALTER TABLE CHECK_PK ADD ( CONSTRAINT XPK_CHECK_PK PRIMARY KEY ( A1, A2 )) ;
-- ORA-955 : NAME IS ALREADY USED BY AN EXISTING OBJECT
-- Descending Index Column 은 Primary Column 으로 사용 불가

DROP INDEX XPK_CHECK_PK ;
CREATE UNIQUE INDEX XPK_CHECK_PK ON CHECK_PK ( A1 , A2 );
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME, DESCEND
FROM DBA_IND_COLUMNS WHERE INDEX_NAME ='XPK_CHECK_PK';
-- XPK_CHECK_PK CHECK_PK A1 ASC
-- XPK_CHECK_PK CHECK_PK A2 ASC
ALTER TABLE CHECK_PK ADD ( CONSTRAINT XPK_CHECK_PK PRIMARY KEY ( A1, A2 )) ;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입