2012-03-02 200 views
2

我有一個外鍵的表,我想合併重複的記錄。mysql更新與重複密鑰更新

我的表看起來像這樣:

user_id | object_id 

表是一個兩列的唯一鍵,所以不能重複。

我的查詢看起來是這樣的:

UPDATE user_object SET object_id = merge_obj_id WHERE object_id = old_object_id 

這工作得很好,直到有連接到兩個舊的對象和merged_object用戶。這會導致重複。我卡住了,我可以想辦法做到這一點與多個查詢和對象操作,但我真的很想在SQL中做到這一點。

更新: 這可能工作?

INSERT INTO user_object (user_id,merge_object_id) SELECT user_id FROM user JOIN 
user_object ON user.user_id = user_object.user_id WHERE object_id = old_object_id ON 
DUPLICATE KEY (DELETE user_object WHERE user_object.user_id = user_id AND 
user_object.user_id = old_object_id);` 

UPDATE: 嘗試這樣做:

INSERT user_object(USER_ID,的object_id) 選擇12345作爲的object_id,user.user_id作爲USER_ID FROM用戶 JOIN user_object ON user.user_id = user_object.user_id
WHERE user_object.object_id = 23456

但它給我這個錯誤:

無法添加或更新子行:外鍵約束失敗(yourtableuser_object,約束FK_user_object_user_idx外鍵(user_id)參考文獻useruser_id))

回答

0

我想你想

INSERT .... ON DUPLICATE KEY UPDATE" 

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

+0

我想,一個早已但我沒有USER_ID插入。我可以得到它,但它需要更多的查詢。我擁有的唯一兩位數據是merged_into_id和old_object_id。所以我不能做插入,因爲我錯過了另一個獨特的關鍵。 – busbina 2012-03-02 21:08:12

2

你可以使用

REPLACE INTO user_object(USER_ID,OBJECT_ID) SELECT 12345 as object_id,user.user_id as user_id FROM user JOIN user_object ON user.user_id = user_object.user_id WHERE user_object.object_id = 23456

這將插入新行之前刪除所有舊行,其匹配。

在合併兩個對象,你既保持舊的對象和合並一個或你刪除其中一個?如果刪除其合併到舊的新的對象,然後就沒有必要更新主鍵爲舊對象引用仍然有效