2013-03-31 21 views
5

moim stole jest czymśOracle SQL UNIQUE A do B, B do A

 
FROM TO  DISTANCE    
------ ---- ---------- 
A  B 100 
B  C 100 
Z  A 120 

muszę dodać ograniczenie do tabeli, która nie pozwoli wkładka B A 100 lub C B 100 lub A Z 120

Mam PRIMARY KEY (from, to) i CONSTRAINT const_u UNIQUE (to, from), ale nie działa zgodnie z oczekiwaniami.

EDYCJA: Nie mogę również wymusić kolejności alfabetycznej na wstawce, ponieważ nie mam dostępu do logiki wstawki EDYCJA # 2: Czy możesz dodać B A 50? - nie, nie możesz. Powinna istnieć tylko jedna unikalna odległość od A do B lub B do A, ale nie obie w tym samym czasie.

+0

Polecam tworzenie wyzwalacza i chk dla dopasowania pary – Akash

+0

Nie mogę utworzyć wyzwalacza. muszę rozwiązać problem w inny sposób. – zeal

+1

Czy możesz dodać 'B A 50'? –

Odpowiedz

10
create unique index on the_table (least(from,to), greatest(from,to)); 

uniemożliwi dodanie (B, A, 100), jeśli (A, B, 100) już w tabeli.

+0

'utwórz unikalny index nazwa_indeksu na the_table (najmniej (od, do), największy (od, do));' działa jak charm, dziękuję :) – zeal

2

Jeśli są chętni, aby ta reguła, możesz spróbować CHECK ograniczenia:

CONSTRAINT force_collation CHECK (FROM < TO) 
+2

jest dobre dla konkretnego przypadku, ale jeśli chcę zapisać 'Z A 100', to się nie powiedzie, chociaż' A Z 100' nie znajduje się w tabeli ... – zeal

+0

Ale nadal można zapisać A Z 100, nie? Dlatego powiedział: "jeśli chcesz uczynić to regułą". – DCookie

+0

Tak, ale nie mogę wymusić kolejności alfabetycznej podczas wstawiania wartości! – zeal

Powiązane problemy