2015-04-05 145 views
1

我有一個朋友表,有'ID','朋友(INTEGER)'和'用戶(INTEGER)'字段。避免重複在mysql插入

用戶和朋友之間存在朋友關係。 即

id  user  friend 

6  22  45 

7  45  22 

是同一個朋友關係,應該被視爲重複記錄。

我要輸入一大堆的一次記錄,所以是這樣的:

INSERT INTO friends (user, friend) VALUES(22, 34), (22, 76), (22, 567)...; 

在這種情況下,我可以輕鬆地使用忽略以避免進入重複(22,34)項(如果( 22,34)已經存在),但是如果(34,22)已經存在,是否有辦法避免輸入(22,34),因爲這是相同的關係。

+1

最簡單的方法:在插入之前,總是對您的關係對進行排序:'(22,45) - >(22,45); (45,22) - >(22,45);'並在兩列中保持唯一的鍵約束。 – dognose 2015-04-05 11:06:44

+0

@satishrajak你沒有讀過這個問題,是嗎? – dognose 2015-04-05 11:07:47

+0

您可以添加一個插入前觸發器來檢查密鑰的朋友列,並在關係已存在的情況下中止插入。但是,您想要設置此代碼的方式我可以稱呼您爲我的朋友,並且您可能不同意。所以你的第二次插入(45,22)更多的是這種友誼的確認,你似乎只想跳過。 – 2015-04-06 02:39:52

回答

1

對每一對進行排序;然後執行INSERT IGNORE以避免錯誤消息。

您可以按你做

INSERT IGNORE INTO tbl (a,b) VALUES (LEAST($a, $b), GREATEST($a, $b)); 

但是插入,爲了做一個批量插入,你或許應該排序在客戶端語言。

另一個問題:INSERT IGNORE將在檢查dup之前創建一個id。因此,大量的AUTO_INCREMENT值將被「燒燬」。

而不是解釋如何避免燃燒,我會說,id似乎沒有很好的理由。相反,有

PRIMARY KEY(user_id, friend_id) 

與排序的另一個問題... SELECT可能需要做一個UNION

(SELECT ... WHERE user_id = $x) 
UNION ALL 
(SELECT ... WHERE friend_id = $x) 

這意味着,你需要這個,太:

INDEX(friend_id, user_id)