2009-05-07 3 views
2

私は、Oracle 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:無効な識別子」というエラーが表示されます。構文が間違っているか、Oracleが遅延可能な機能インデックスをサポートしていない可能性がありますか?誰かが私に解決策を提供することができますか、それとも決定的な回答ですか?

答えて

5

惜しいが、Oracle 10gのマニュアルによると、CREATE INDEXをし、制約をADDのALTER TABLEの構文を使用すると、その構文エラーを得た理由である、この点で交換されていません。そのため、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 ] 

したがってUNIQUE制約定義のみ列名であってもよく、カラム表現することはできません。

仮想列を使用して11gでこれを行うことができます.10g以前では、派生列を作成する傾向があります(プログラマチックに最新の状態に保つという負担があります)。

+0

さて、私は決定的な答えを求めました。明らかに、これは私が望んでいたものではないにしても、それです。 ;) – Chris

1

私は11g virtual columnsの機能が必要だと思います。関数を仮想列として作成し、その上にcosntraintを追加します。

+0

私は11gインストールにアクセスする準備ができていません。誰かがゲイリーの解決策を確認できますか? 上記のリンク先の言語リファレンスで、この文が気付きました。「仮想カラムに定義されたテーブルインデックスは、テーブル上の関数ベースのインデックスと同等です。」 実際に11gの仮想列を使用するソリューションがある場合、おそらくそこには同等のソリューションがありますか? – Chris

-2

Ask Tomこの問題を解決します。答えはいいえです。機能インデックスに基づいてユニークな制約を作成することはできません。

+0

リンクされた "Ask Tom"の記事は、ここでの質問に接してのみ関連しているようです。この記事のユーザーは、「選択的にユニーク」のインデックスを作成する方法を尋ねています。このインデックスには、基本的に「なぜノーバイデートを使用するのですか?この応答では、実際にNOVALIDATEを持つ機能インデックスを持つことが可能かどうかが明確に示されておらず、インデックスを遅延可能にすることについても言及していません。 – Chris

+0

機能インデックスに基づいてユニークな制約を作成することは可能です。問題は、それらを遅延可能にする方法です。 – Chris

関連する問題