2009-05-07 3 views
2

오라클 10g에서 연기 가능한 고유 기능 인덱스를 만들고 싶습니다.Oracle에서 연기 가능한 고유 한 기능 색인을 가질 수 있습니까?

create unique index LIST_ITEM_ENTRY_NO_UNIQ 
on LIST_ITEM (case status when 'cancel' then null else LIST_KEY end, 
       case status when 'cancel' then null else ENTRY_NO end); 

나는 연기 고유 인덱스를 생성하는 방법을 알고 :

내가 고유 기능 인덱스를 생성하는 방법을 알고

:이 두 가지를 알고

alter table LIST_ITEM add constraint LIST_ITEM_ENTRY_NO_UNIQ 
unique (LIST_KEY,ENTRY_NO) deferrable initially deferred; 

을, 나는이 시도

alter table LIST_ITEM add constraint LIST_ITEM_ENTRY_NO_UNIQ 
unique (case STATUS when 'cancel' then null else LIST_KEY end, 
     case STATUS when 'cancel' then null else ENTRY_NO end) 
deferrable initially deferred; 

하지만 "ORA-00904 : 잘못된 식별자"오류가 발생합니다. 구문이 잘못되었거나 오라클이 연기 가능한 기능 색인을 지원하지 않습니다. 누군가 해결책이나 확실한 답을 제게 줄 수 있습니까?

답변

5

니스 시도하지만, 오라클 10g 문서에 따르면, INDEX 및 CREATE TABLE의 추가 CONSTRAINT를 ALTER위한 구문은 해당 구문 오류가있어 이유는,이 점에서 서로 호환되지 않습니다 : 따라서 CREATE

CREATE INDEX ::= 

    CREATE [ UNIQUE | BITMAP ] INDEX [ schema. ]index 
     ON { cluster_index_clause 
     | table_index_clause 
     | bitmap_join_index_clause 
     } ; 

table_index_clause ::= 

    [ schema. ]table [ t_alias ] 
    (index_expr [ ASC | DESC ] 
     [, index_expr [ ASC | DESC ] ]...) 
    [ index_properties ] 

index_expr ::= { column | column_expression } 

을 INDEX는 기본적으로 "함수 기반 색인"인 column_expression을 허용합니다. 한편

:

ALTER TABLE ::= 
ALTER TABLE [ schema. ]table 
    [ alter_table_properties 
    | column_clauses 
    | constraint_clauses 
    | alter_table_partitioning 
    | alter_external_table_clauses 
    | move_table_clause 
    ] 
    [ enable_disable_clause 
    | { ENABLE | DISABLE } 
    { TABLE LOCK | ALL TRIGGERS } 
    [ enable_disable_clause 
    | { ENABLE | DISABLE } 
     { TABLE LOCK | ALL TRIGGERS } 
    ]... 
    ] ; 

constraint_clauses ::= 
{ ADD { out_of_line_constraint 
     [ out_of_line_constraint ]... 
     | out_of_line_REF_constraint 
     } 
| MODIFY { CONSTRAINT constraint 
     | PRIMARY KEY 
     | UNIQUE (column [, column ]...) 
     } 
     constraint_state 
| RENAME CONSTRAINT old_name TO new_name 
| drop_constraint_clause 
} 

out_of_line_constraint ::= 
[ CONSTRAINT constraint_name ] 
{ UNIQUE (column [, column ]...) 
| PRIMARY KEY (column [, column ]...) 
| FOREIGN KEY (column [, column ]...) 
    references_clause 
| CHECK (condition) 
} 
[ constraint_state ] 

따라서 고유 제한 조건 정의는 열 이름 일 수 있으며, 열 표현이 될 수 없습니다.

가상 열을 사용하여 11g에서이를 수행 할 수 있습니다. 10g 이하에서는 대부분 프로그래머가 최신 상태로 유지해야하는 부담과 함께 파생 열을 만드는 경향이 있습니다.

+0

글쎄, 나는 확실한 답을 구했다. 분명히 이것이 내가 원하는 바가 아니더라도 그것이 다. ;) – Chris

1

11g virtual columns 기능이 필요하다고 생각합니다. 함수를 가상 열로 만든 다음 cosntraint를 추가합니다.

+0

11g 설치에 대한 준비가되지 않았습니다. 누군가 게리의 해결책을 확인할 수 있습니까? 위 링크 된 언어 참조에서이 문을 발견했습니다. "가상 열에 정의 된 테이블 인덱스는 테이블의 함수 기반 인덱스와 같습니다." 실제로 11g 가상 열을 사용하는 솔루션이 있다면 그 솔루션이없는 동등한 솔루션이 있습니까? – Chris

-2

Ask Tom이이 문제를 해결합니다. 대답은 아니오입니다. 기능적 색인을 기반으로 고유 한 제약 조건을 만들 수는 없습니다.

+0

연결된 "Ask Tom"문서는 여기에있는 질문에만 접하게 관련되어 있습니다. 이 기사의 사용자는 novalidate를 사용하여 "선택적으로 고유 한"색인을 작성하는 방법을 묻습니다.이 색인은 기본적으로 "왜 novalidate를 사용해야합니까? 단지 원하는 색인을 선택하여 원하는 것을 얻을 수 있습니다." 응답은 사실상 NOVALIDATE가있는 기능적 색인을 가질 수 있는지 여부를 명확하게 나타내지 않으며 색인을 연기 할 수 있다고 언급하지도 않습니다. – Chris

+0

기능 색인에 따라 고유 한 제한 조건을 분명하게 만들 수 있습니다. 문제는 연기 할 수있는 방법입니다. – Chris

관련 문제