2014-09-03 83 views
0

我在這裏有一個問題,我無法找到一個適當的解決方案在我的研究,也許這是因爲我找不到確切的術語來搜索它,所以如果這是重複我將刪除它。約束,以避免外鍵的組合

我的問題是我想知道是否有可能避免兩個字段之間的數據組合。我將展示我想避免的結構和數據類型。這將更容易理解。

Table_A       Table_B 
------------------------  -------------------------------    
id integer (PK)     id integer (PK) 
description varchar(50)   title varchar(50) 
           id1_fromA (FK A->id) 
           id2_fromA (FK A->id) 

我試圖驗證上表Table_B(組合是id1_fromA和id2_fromA之間)

id title   id1_fromA id2_fromA 
1 Some Title   1   2 --It will be permmited 
2 Some other   1   2 --It is a duplicate NOT ALLOWED 
3 One more   1   1 --It is equals NOT ALLOWED 
4 Another   2   1 --It is same as registry id 1 so NOT ALLOWED 
5 Sample data  3   2 --It is ok 

利用上述數據I可以很容易地解決註冊表ID=2問題以下數據

ALTER TABLE table_B ADD CONSTRAINT UK_TO_A_FKS UNIQUE (id1_fromA, id2_fromA); 

而註冊表ID=3

的問題
ALTER TABLE table_B ADD CONSTRAINT CHK_TO_A_FKS CHECK (id1_fromA != id2_fromA); 

我的問題是ID=4我想避免組合1,2 = 2,1的這種重複的註冊表。是否有可能通過CONSTRAINTINDEXUNIQUE來完成,或者我需要創建一個觸發器或程序來執行此操作?

在此先感謝。

回答

2

你不能用一個唯一的約束來做到這一點,但你可以用一個獨特的索引做到這一點。

create unique index UK_TO_A_FKS 
    on table_b (least(id1_froma, id2_froma), greatest(id1_froma, id2_froma)); 
+0

工作優雅,謝謝:) – 2014-09-03 17:05:11