대상 버전
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 생성이 가능합니다.
# 예제
1. PK 컬럼 순서를 바꾸어 local prefixed index를 PK로 생성하는 예제.
2. local non-prefixed index를 PK로 생성하지 않고 non-unique index로 생성하는 예제.
3. 6.3.1 버전으로 업그레이드 후 global index로 PK를 생성하는 예제.
참고 사항
# 파티션 테이블을 위한 인덱스 종류
분류조건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로 생성하지 못하는 것입니다.