2012-03-02 285 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

这将插入新行之前删除所有旧行,其匹配。

在合并两个对象,你既保持旧的对象和合并一个或你删除其中一个?如果删除其合并到旧的新的对象,然后就没有必要更新主键为旧对象引用仍然有效