2011-07-15 10 views
7

私は履歴を保持しなければならないので、 'Y'または 'N'を持つことができるis_deleted列を使用しています。しかし、is_deleted 'N'のインスタンスに対しては、(a、b、c)の複合カラムに対して一意のエントリが必要です。Oracle:関数ベースのインデックスの選択的一意性

私は関数ベースのユニークなインデックスを作成しようとしているときにエラーが発生しています。

CREATE UNIQUE INDEX fn_unique_idx ON table1 (CASE WHEN is_deleted='N' then (id, name, type) end); 

行1でエラー: ORA-00907:欠落している右括弧

助けてください。

おかげ

答えて

13

あなたは

SQL> create table table1 (
    2 id number, 
    3 name varchar2(10), 
    4 type varchar2(10), 
    5 is_deleted varchar2(1) 
    6 ); 

Table created. 

SQL> CREATE UNIQUE INDEX fn_unique_idx 
    2  ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END, 
    3     CASE WHEN is_deleted='N' THEN name ELSE null END, 
    4     CASE WHEN is_deleted='N' THEN type ELSE null END); 

Index created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'N'); 

1 row created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'Y'); 

1 row created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'Y'); 

1 row created. 

SQL> insert into table1 values(1, 'Foo', 'Bar', 'N'); 
insert into table1 values(1, 'Foo', 'Bar', 'N') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (SCOTT.FN_UNIQUE_IDX) violated 


SQL> insert into table1 values(1, 'Foo', 'Zee', 'N'); 

1 row created. 
+0

アクションで

CREATE UNIQUE INDEX fn_unique_idx ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END, CASE WHEN is_deleted='N' THEN name ELSE null END, CASE WHEN is_deleted='N' THEN type ELSE null END); 

ような何か制約の例が必要になります。しかし、私のユースケースは、(IDのis_deleted = 'N' を組み合わせたものです、名前、タイプ) - 複合キーは一意でなければなりません。あなたの質問は同じになるのでしょうか? –

+0

@Andriod_enthusiast - 確かにそうだ。私は走ったテストで自分の答えを更新しました。 –

+0

ありがとうございました。感謝します。だから私はこれらの列にnullの拘束がない場合、ELSE nullを省略することができると思います。 –

関連する問題