2011-01-10 17 views
8

Czy obsługuje ograniczenia z takimi wyrażeniami jak w przypadku Oracle?Wyjątkowe ograniczenie Oracle z wyrażeniem

Wskazówka Z = 'N'

ALTER TABLE A ADD CONSTRAINT U_A_KEY UNIQUE(X,Y,Z = 'N'); 

Czy to Unique constraint możliwe?

przykład:

INSERT INTO A VALUES('X','Y','N'); --OK 
INSERT INTO A VALUES('X','Y','Y'); --OK 
INSERT INTO A VALUES('X','Y','Y'); --OK 
INSERT INTO A VALUES('X','Y','N'); --VOLIATION 
+0

Czy to oznacza, że ​​chcesz mieć co najwyżej jeden rekord z Z = "N" dla każdej kombinacji x, y? –

+0

Tak, zgadza się. – JamesC

Odpowiedz

18

Może to daje wyobrażenie

drop table tq84_n; 

create table tq84_n (
    x number, 
    y number, 
    z varchar2(10) 
); 

create unique index tq84_n_x on tq84_n (
    case when z = 'N' then x || '-' || y 
     else null 
    end 
); 

nowsze:

insert into tq84_n values (4,5, 'N'); 

insert into tq84_n values (9,6, 'Y'); 
insert into tq84_n values (9,6, 'Y'); 

insert into tq84_n values (4,5, 'Y'); 

insert into tq84_n values (4,5, 'N'); 

Ostatnio jeden rzuca:

ORA-00001: unique constraint (SPEZMDBA.TQ84_N_X) violated 
+0

To spełnia przypadek użycia, dzięki za sugestię. – JamesC

+1

+1 za pokazanie naruszenia ograniczenia. –

6

Najprostsze podejście w tym przypadku jest na ogół, aby utworzyć wskaźnik oparty na funkcji. Coś jak

CREATE UNIQUE INDEX u_a_key 
    ON a((CASE WHEN z = 'N' THEN x ELSE null END), 
      (CASE WHEN z = 'N' THEN y ELSE null END)); 

Jeśli oo nie jest „N”, oba twierdzenia CASE oceniają NULL i Oracle nie musi przechowywać x & wartości y w strukturze indeksu (co indeks mniejszy). Jeśli z jest "N", wartości x y są przechowywane w indeksie, a indeks zachowuje się tak jak każdy inny indeks złożony.

0

Co mam zrobić w tej sitaution jest stworzenie kolumny np Z w swojej sprawie, która posiada:

  • Szczególną wartość (np swoją „N”) w przypadku muszę go mieć unikalny
  • Null inaczej, czyli nieznane: dwóch nieznanych wartości są uważane nie być równi sobie nawzajem.

Następnie można utworzyć unikalne ograniczenie UNIQUE(X,Y,Z).

Dodaj dwa wiersze z równymi X i Y oraz Z = "N", a otrzymasz błąd; dodaj dwa wiersze z równymi X i Y, oba z Z = null, a ty nie.

+0

Kolumna Z może pomieścić inną wartość, która musi przejść ograniczenie. Pytanie zaktualizowane z SQL dla wyjaśnienia, dziękuję. – JamesC

Powiązane problemy