2016-08-16 2 views
0

구문에 어떤 문제가 있는지 설명 할 수 있습니까? 나는 제약 조건 프라이 머리 키와 고유를 추가하고 싶지만 또한 동일한 인덱스 (복합 인덱스)를 사용하고 싶다.온라인 SQL 색인 작성 문제가 발생했습니다. 오라클

create table val (
val1 number, val2 number, 
constraint val_pk primary key(val1) using index(create index val_index on val(val1,val2)), 
constraint val_unique unique (val2) using index val_index); 

은 그 오류를 나에게 답변을

create table val (
val1 number, val2 number, 
constraint val_pk primary key(val1) using index(create index val_index on val(val1,val2)), 
constraint val_unique unique (val2) using index val_index) 
Error report - 
SQL Error: ORA-14196: Specified index cannot be used to enforce the constraint. 
14196. 00000 - "Specified index cannot be used to enforce the constraint." 
*Cause: The index specified to enforce the constraint is unsuitable 
      for the purpose. 
*Action: Specify a suitable index or allow one to be built automatically. 

감사를 제공합니다.

+1

왜'val1, val2'의 색인은'val2'에 유일한 제약을 적용하는 데 적합할까요? 'val_index'를 반대 순서로 정의 할 수 있습니까? –

답변

0

오라클은 기본 키 또는 고유 제한 조건을 적용하기 위해 색인을 사용합니다.

기본적으로 적합한 색인이 아직 존재하지 않으면 오라클은 자동으로 제약 조건 정의와 동일한 열과 순서로 고유 색인을 작성합니다.

그러나 Oracle은 고유하지 않은 색인도 사용할 수 있으며 열은 제약 조건과 동일 할 필요가 없습니다. 인덱스를 사용할 수하는

그러나, 인덱스의 최고의 열은 제약 조건에 정의 된 모든 열을 포함해야합니다. 당신은 인덱스가있을 경우 경우에 따라서

는 다음과 같이 정의 : val1이 열의를 선도 때문에

create index val_index on val(val1,val2) 

... val1에 기본 키를 적용하는 데 사용할 수 있습니다 색인

val2이 인덱스의 두 번째 열이기 때문에 val2에 고유 제한을 적용하는 데 사용할 수 없습니다. 한편

, 그것은 당신이 그들이 모두 인덱스의 최고의 열 (1 적용되기 때문에 그 조합을 모두 성공적으로 인덱스를 사용할 수 (val1, val2) 또는 (val2, val1)에 고유 제한 조건을 정의 색인의 두 번째 열). 물론 두 제약 조건을 모두 갖는 것은 불필요하므로이를 수행하는 것이 타당하지 않습니다.

두 개의 서로 다른 열에 본질적으로 2 개의 고유 한 구속 조건을 갖는 것은 최소한 2 개의 인덱스가 필요합니다. 단일 인덱스로 두 제약 조건을 적용 할 수 없습니다.

1

오류 메시지는 분명합니다. val2의 고유 조건은 복합 색인 (val1, val2)에 의해 시행 될 수 없습니다.

왜 인덱스를 지정해야 할 필요가 있다고 생각하십니까? 왜 사용하지 않는가?

contraint unq_table_val2 unique(val2) 
관련 문제