Created with Raphaël 2.1.0
    Loading...
Skip to end of metadata
Go to start of metadata

대상 버전

6.1.1 이하 버전

증상

파티션 테이블에 PK 또는 UNIQUE INDEX 생성 시 다음 에러 발생.

[ERR-31283 : Unable to create a primary key or a unique key constraint in the local non-prefixed index.]

원인

다음과 같이 altierr 유틸리티를 이용하여 해당 에러에 대한 설명을 확인할 수 있습니다.

$ altierr 0x31283

0x31283 ( 201347) qpERR_ABORT_QDX_NOT_ALLOWED_PRIMARY_AND_UNIQUE_KEY_OF_NONE_PREFIXED_INDEX Unable to create a primary key or a unique key constraint in the local non-prefixed index.
# - The user tried to create a primary key or a unique key constraint in the local prefixed index.
# *Action:
# - Please do not create a primary key or a unique key constraint in the local non-prefixed index.

알티베이스 6.1.1 이하 버전에서는 global index를 지원하지 않습니다.

따라서 모든 파티션 인덱스는 local index이고 local non-prefixed index를 PK나 UNIQUE INDEX로 생성할 수 없습니다.

local non-prefixed index를 PK나 UNIQUE INDEX로 생성할 수 없는 이유는 해당 컬럼값이 특정 파티션 내에서 유일한 값이더라도 테이블 전체에서 UNIQUE함을 보장할 수 없기 때문입니다.

(테이블 전체에서 UNIQUE 속성을 검사하기 위해서는 전체 파티션을 검사해야 하는데 local index는 특정 파티션 내에서만 UNIQUE 속성을 검사함.)

해결 방안

1. PK나 UNIQUE INDEX는 prefixed index로 생성해야 합니다. 즉, PK나 UNIQUE INDEX는 파티션 키컬럼과 인덱스 컬럼이 동일해야 합니다.

2. 파티션 키컬럼과 동일하지 않은 컬럼으로 인덱스 생성을 원하다면 NON-UNIQUE INDEX로 생성할 수 있습니다.

3. 알티베이스를 6.3.1 이상 버전으로 업그레이드 하면 global index로 PK나 UNIQUE INDEX 생성이 가능합니다.

 

# 예제

iSQL> CREATE TABLE REALSET_CONTENTS
2 (
3 CT_ID VARCHAR (32) NOT NULL,
4 CT_TYPE VARCHAR (2) NOT NULL,
5 CT_PATH VARCHAR (256) NOT NULL,
6 CT_URL VARCHAR (256) NOT NULL,
7 REG_DATE DATE NOT NULL,
8 FILE_NAME VARCHAR (256) NOT NULL,
9 STATUS VARCHAR (4) NOT NULL
10 )
11 PARTITION BY RANGE (REG_DATE)
12 (
13 PARTITION P_1 VALUES LESS THAN (to_date('2013-05-01', 'YYYY-MM-DD')),
14 PARTITION P_2 VALUES LESS THAN (to_date('2013-09-01', 'YYYY-MM-DD')),
15 PARTITION P_DEF VALUES DEFAULT
16 )
17 TABLESPACE SYS_TBS_DISK_DATA;
Create success.
iSQL> alter table REALSET_CONTENTS add primary key(CT_ID,REG_DATE);
[ERR-31283 : Unable to create a primary key or a unique key constraint in the local non-prefixed index.]

1. PK 컬럼 순서를 바꾸어 local prefixed index를 PK로 생성하는 예제.

iSQL> alter table REALSET_CONTENTS add primary key(REG_DATE,CT_ID);
Alter success.
iSQL> desc REALSET_CONTENTS
[ TABLESPACE : SYS_TBS_DISK_DATA ]
[ ATTRIBUTE ]
------------------------------------------------------------------------------
NAME                                     TYPE                        IS NULL
------------------------------------------------------------------------------
CT_ID                                    VARCHAR(32)                 NOT NULL
CT_TYPE                                  VARCHAR(2)                  NOT NULL
CT_PATH                                  VARCHAR(256)                NOT NULL
CT_URL                                   VARCHAR(256)                NOT NULL
REG_DATE                                 DATE                        NOT NULL
FILE_NAME                                VARCHAR(256)                NOT NULL
STATUS                                   VARCHAR(4)                  NOT NULL
[ INDEX ]
------------------------------------------------------------------------------
NAME                                     TYPE     IS UNIQUE     COLUMN
------------------------------------------------------------------------------
__SYS_IDX_ID_142                         BTREE    UNIQUE        REG_DATE ASC,
                                                                CT_ID ASC
[ PRIMARY KEY ]
------------------------------------------------------------------------------
REG_DATE, CT_ID

2. local non-prefixed index를 PK로 생성하지 않고 non-unique index로 생성하는 예제.

iSQL> create index REALSET_CONTENTS_IDX1 on REALSET_CONTENTS(CT_ID,REG_DATE) local;
Create success.
iSQL> desc REALSET_CONTENTS
[ TABLESPACE : SYS_TBS_DISK_DATA ]
[ ATTRIBUTE ]
------------------------------------------------------------------------------
NAME                                     TYPE                        IS NULL
------------------------------------------------------------------------------
CT_ID                                    VARCHAR(32)                 NOT NULL
CT_TYPE                                  VARCHAR(2)                  NOT NULL
CT_PATH                                  VARCHAR(256)                NOT NULL
CT_URL                                   VARCHAR(256)                NOT NULL
REG_DATE                                 DATE                        NOT NULL
FILE_NAME                                VARCHAR(256)                NOT NULL
STATUS                                   VARCHAR(4)                  NOT NULL
[ INDEX ]
------------------------------------------------------------------------------
NAME                                     TYPE     IS UNIQUE     COLUMN
------------------------------------------------------------------------------
REALSET_CONTENTS_IDX1                    BTREE                  CT_ID ASC,
                                                                REG_DATE ASC
REALSET_CONTENTS has no primary key

3. 6.3.1 버전으로 업그레이드 후 global index로 PK를 생성하는 예제.

iSQL>  alter table REALSET_CONTENTS add primary key(CT_ID,REG_DATE);
Alter success.
iSQL> desc REALSET_CONTENTS
[ TABLESPACE : SYS_TBS_DISK_DATA ]
[ ATTRIBUTE ]
------------------------------------------------------------------------------
NAME                                     TYPE                        IS NULL
------------------------------------------------------------------------------
CT_ID                                    VARCHAR(32)                 NOT NULL
CT_TYPE                                  VARCHAR(2)                  NOT NULL
CT_PATH                                  VARCHAR(256)                NOT NULL
CT_URL                                   VARCHAR(256)                NOT NULL
REG_DATE                                 DATE                        NOT NULL
FILE_NAME                                VARCHAR(256)                NOT NULL
STATUS                                   VARCHAR(4)                  NOT NULL
[ INDEX ]
------------------------------------------------------------------------------
NAME                                     TYPE     IS UNIQUE     COLUMN
------------------------------------------------------------------------------
__SYS_IDX_ID_922                         BTREE    UNIQUE        CT_ID ASC,
                                                                REG_DATE ASC
[ PRIMARY KEY ]
------------------------------------------------------------------------------
CT_ID, REG_DATE

참고 사항

# 파티션 테이블을 위한 인덱스 종류

분류조건1

분류조건2

분류조건3

인덱스 종류

알티베이스 지원여부

인덱스가 파티션 되어 있음.

index part key = table part key

index part key = index key

(Partitioned) Local prefixed Index

지원

 

 

index part key != index key

(Partitioned) Local nonprefixed Index

지원

 

index part key != table part key

index part key = index key

(Partitioned) Global prefixed Index

미지원

 

 

index part key != index key

(Partitioned) Global nonprefixed Index

미지원

인덱스가 파티션 되어 있지 않음.

 

 

Nonpartitioned global index

6.3.1 이상 버전에서 지원

prefixed index와 nonprefixed index를 구분하는 이유는 unique 속성 때문입니다.

nonprefixed index의 경우 파티션 내에서 unique 하더라도 테이블 전체에서 unique 함을 보장하지 못합니다.

따라서 nonprefixed index는 PK나 UNIQUE INDEX로 생성하지 못하는 것입니다.

  

  • No labels