2013-06-04 37 views
4

我有一個友誼用戶之間的表,看起來像這樣。MYSQL插入或更新,如果存在一個單向複合主鍵表

CREATE TABLE user_relations (
pkUser1 INTEGER UNSIGNED NOT NULL, 
pkUser2 INTEGER UNSIGNED NOT NULL, 
pkRelationsType TINYINT UNSIGNED NOT NULL, 
PRIMARY KEY(pkUser1,pkUser2), 
FOREIGN KEY(pkuser1) references users(ID), 
FOREIGN KEY(pkuser2) references users(ID), 
FOREIGN KEY(pkRelationsType) references user_relations_type(ID) 
); 

pkRelationsType是指向定義的那種關係的用戶具有另一表(友誼(1),待處理(2)或阻斷(3))

如果用戶1是朋友與用戶2我只有一個實例|1|2|1|不也|2|1|1|

事情是,爲了阻止用戶,我必須牢記已經可以建立關係(用戶可能已經是朋友,甚至有待處理的友誼請願),所以我試圖插入數據或更新如果關係不存在。

我有這樣的友誼請求發送,但如果數據已經存在,這恰恰忽略了插入。

INSERT INTO 
user_relations(pkUser1,pkUser2,pkRelationsType) 
SELECT * FROM (SELECT :sender0,:target0,2) AS tmp 
WHERE NOT EXISTS 
(SELECT pkUser1 FROM user_relations 
    WHERE 
    (pkUser1= :sender1 AND pkUser2=:target1) OR (pkUser1=:sender2 AND pkUser1=:target2) LIMIT 1) 

由於表格的性質,我不能使用INSERT ... ON DUPLICATE KEY UPDATE

我一直在想如何處理它與PHP,尋找關係,它的順序,如果存在,然後做一件事或另一件事,但它似乎是一個浪費處理。

請注意,儘管我已經處理了自己,但我不是MYSQL專家。 希望我已經很好地解釋了我自己。

感謝您的反饋意見。

+1

如果您不能使用'ON DUPLICATE KEY UPDATE',那麼您需要決定是否可以使用'INSERT'或'UPDATE',如果您希望多個操作完成服務器端,可能需要一個[存儲過程](http://dev.mysql.com/doc/refman/5.5/en/stored-routines.html)。 – Orbling

回答

1

從您的描述來看,您似乎只保留「最新」的關係。如果是這種情況,爲什麼不先刪除關係,然後插入新關係?

+0

我有點太固執,不知道我可以做到這一點,謝謝。 – Teka

相關問題