2011-07-15 8 views
7

Muszę zachować historię, dlatego używam kolumny is_deleted, która może mieć "Y" lub "N". Ale dla każdego wystąpienia is_deleted "N" powinienem mieć wpisu uniwue dla kolumn złożonych (a, b, c).Oracle: Indywidualna selektywność na podstawie indeksów funkcji

Kiedy próbuję utworzyć unikalny indeks oparty na funkcji, otrzymuję komunikat o błędzie.

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

BŁĄD w linii 1: ORA-00907 : brak nawiasie

Proszę o pomoc.

Dzięki

Odpowiedz

13

będzie trzeba coś takiego

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); 

przykładem ograniczeń w działaniu

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

Ale moja USECASE jest gdy is_deleted = 'N' następnie połączenie (id, nazwa, typ) - klucz złożony powinien być niepowtarzalny. Czy Twoje zapytanie będzie takie samo? –

+0

@Andriod_enthusiast - Z pewnością wydaje się. Zaktualizowałem swoją odpowiedź testem, który przeprowadziłem. –

+0

wielkie dzięki. doceniam to. Tak więc, jeśli nie mam null consraint na tych kolumnach myślę, że mogę pominąć ELSE null –

Powiązane problemy