2011-10-20 95 views
1

這裏是我的表:如何防止重複的值插入mySQL考慮兩列?

表名:UserLinks

Link_ID User_1 User_2 
1   234325 100982 
2   116727 299011 
3   399082 197983 
4   664323 272351 

基本上,在這個表中的重複值是:

Link_ID User_1 User_2 
1   232  109 
2   109  232 

我已經環顧四周,發現我應該使用INSERT IGNORE以防止重複條目,但我不確定如何編寫一個查詢,認爲User_1和User_2之間的關係與User_2和User_1之間的關係相同。

任何意見/幫助真的很感激。

回答

1

那是一個有點討厭,2場之間的交換關係,而是一種獨特的指數將不利於中給出的數值可以是倒過來。

如果您可以更改代碼/數據以確保ID的較低值始終放在user_1字段中,那麼至少可以讓唯一索引工作 - 但它有點討厭。

或者如果插入設置基於(例如不連續在同一時間,但一組行),你可以加入到現有的數據和反連接基於左右逢源例如圓:

(existing.user_1 = new.user_1 and existing.user_2 = new user_2) 
OR (existing.user_1 = new.user_2 and existing.user_2 = new user_1) 

,並在where子句檢查,以確保沒有匹配的製作(的投身抗日部分)

where existing.link_id is null 

這不會在同一時間插入是有效的排不過。

+0

啊!你上面提供的解決方案似乎很有希望 – TaylorMac

0

你需要多準確。您可以創建一個唯一的索引(或主鍵),它是兩個值的散列值。

類似主鍵(md5(user_1)xor md5(user_2))。

因爲 「MD5(232)XOR MD5(109)」 將總是等於 「MD5(109)XOR MD5(232)」。它無關緊要。

這將有碰撞的可能性很小,如果你有很多的記錄(如百萬或數十億),但除此之外,它應該工作。

您可能需要檢查在SQL這一點,因爲我沒有測試,如果SQL允許這樣要生成主鍵。

這樣,你不需要插入或更新作爲唯一constrant會做檢查你何時添加任何額外的檢查。