2013-04-12 88 views
1

我有三列(node1 varchar, node2 varchar, other_data intSQL:如何應用唯一約束兩列,其中兩個項目(無序)的組合是唯一的

節點1和節點的節點構成的邊緣爲表一張圖。

因此if node1 = A and node2 = B,它將相當於node1 = B and node2 = A

有沒有辦法確保無法創建重複條目。

例如,如果下面是輸入:

node1 = A, node2 = B, other = 123 

如果有人試圖輸入以下內容作爲兩個節點已經在表中,它會失敗:

node1 = B, node2 = A, other = 123 

回答

1

寫觸發它在node1和node2的SORTED組合上構建一個構造字段,並嘗試將其插入唯一索引。

1

我通常會用CHECK約束實現這使得node1總是比排序早node2

create table T(
    node1 varchar(20) not null, 
    node2 varchar(20) not null, 
    other_data int null, 
    constraint CK_T_node_order CHECK (node1<node2), 
    constraint UQ_T_nodes UNIQUE (node1,node2) 
) 

它增加了複雜性的INSERT但使強制執行您想要的約束很容易。

當然,你還沒有說過你使用的SQL產品。如果你不支持CHECK約束(Grr.MySQL,我在看你),你必須使用觸發器來實現檢查約束。