2011-11-23 125 views
0

我艾米試圖建立針對特定網站的營銷問題統計表:SQL交叉引用表

目前我計劃建立的表像這樣

Source_IP source_city Destination_IP destination_city 
127.0.0.1  NY   242.212.12.1   Paris 
242.212.12.1 Paris   127.0.0.1   NY 

我想阻止的情況下,如上述IE (Source_ip,source_city)和(Destination_IP destination_city)的組合應該只有一個記錄,而不是2我怎樣才能防止這在SQL?

+0

什麼樣的數據庫供應商? –

+1

我建議的第一件事是將IP地址轉換爲整數值。如果你... – Sparky

回答

0

假設你的DBMS允許基於函數的索引,下面會做的伎倆:

CREATE UNIQUE INDEX idx_no_dupes 
    ON your_table (least(source_ip, destination_ip), greatest(source_ip, destination_ip)); 

採用leastgreatest總會指數「同一順序」的元組,所以也無所謂哪個值在哪個列中。

如果您的DBMS不支持leastgreatest您將需要用CASE構造替換它。

0

規範化表...

拿一個表,包含位置ID,知識產權,城市名稱

位置和有第二個表,你可以把 雙位置IDS 的一個位置ID和一對ID ...

例如:

表1:

Location 
    ID IP    City 
    1 127.0.0.1  Ny 
    2 242.212.12.1 Paris 

表2:

Pairs 
    ID Location 
    1  1 
    1  2 
+0

這可能是一個更好的設計,但它仍然不能解決避免A B和B A對的問題。 –

+0

@SteveWellens ...我有一個可憐的詞選擇... myabe現在很清楚 – DarkSquirrel42

0

對於MS SQL服務器,你可以實現一個檢查約束

我的第一個想法是,好了,第一個念頭。因此,這裏有更好的建議,但另一種可能性雖然可能不是很好,但是在插入或更新時實施觸發器首先搜索表以確保這些項不存在於其他位置。如果沒有找到,則觸發器允許該操作,否則,它會回滾。就像我說的,不是很好,但有可能。

+0

如何定義檢查多行的檢查約束? –

+0

源IP <目標IP的檢查約束將「起作用」(但代價是複雜的插入代碼) –