2013-03-31 34 views
5

我的表是一樣的東西的Oracle SQL唯一約束A到B,B到A

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

我需要添加一個約束表,不會讓插入 B A 100C B 100A Z 120

我有一個PRIMARY KEY (from, to)CONSTRAINT const_u UNIQUE (to, from)但它沒有按預期工作。

編輯: 我也不能強制按字母順序插入正確的順序,因爲我沒有訪問插入邏輯 編輯#2:你可以添加B A 50嗎? - 不,你不能。從A到B或B到A只有一個唯一的距離,但不能同時有兩個距離。

+0

我會建議創建一個觸發器和chk匹配巴黎 – Akash

+0

我不能創建一個觸發器。我必須以另一種方式解決問題。 – zeal

+1

你可以加上'B A 50'嗎? –

回答

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

將阻止添加(B,A,100)如果(A,B,100)已經在桌子上了。

+0

'在the_table上創建唯一索引index_name(最少(from,to),最大(from,to));'像魅力一樣工作,謝謝:) – zeal

2

如果你願意做這個規則,你可以嘗試一個CHECK約束:

CONSTRAINT force_collation CHECK (FROM < TO) 
+2

這對於特定情況非常有用,但是如果我想要保存'Z A 100',雖然'A Z 100'不在表格中,但它會失敗。 – zeal

+0

但是你仍然可以保存A Z 100,不是嗎?這就是爲什麼他說「如果你願意做這個規則」。 – DCookie

+0

是的,但我不能強制插入值的字母順序! – zeal

相關問題