仅当更新的行尚不存在时才能更新一组行吗?

时间:2014-03-24 20:37:33

标签: mysql sql

我有一个包含两个表的数据库,urltweeturl具有以下结构:

 id | expanded_url | display_url | url
---------------------------------------

urltweet之间存在多对多关系,因此有一个JOIN表(urls_tweets)如下所示:

 id | tweet_id | url_id
------------------------

问题是url表中有重复的条目 - 没有正确使用唯一索引,我正在尝试清除重复项,以便我可以创建它们。我运行查询以查找url表中的所有重复条目,并且删除它们非常容易。

现在的问题是我需要更新urls_tweets以指向规范记录,因为正在删除重复项。当然,在urls_tweets中,tweet_idurl_id必须是唯一的。运行如下所示的简单查询失败,因为它会创建违反urls_tweets上的唯一性约束的记录:

UPDATE urls_tweets SET url_id = <primary url record id> WHERE url_id IN (<duplicate url record ids>);

有没有办法更新,创建或删除或我必须做的任何事情,让urls_tweets中的记录指向正确的url记录而不会有重复(tweet_idurl_id)对?

1 个答案:

答案 0 :(得分:0)

创建一个表url_id_remap,其中包含重复项的所有url_ids和首选的规范url_id。在删除时填充此表。

然后使用JOIN更新您的urls_tweets表:

UPDATE urls_tweets AS ut
JOIN url_id_remap AS r ON ut.url_id = r.duplicate_url_id
SET ut.url_id = r.canonical_url_id;

JOIN自然会将此限制为仅需要更改的行,因为它不会在url_id_remap中找到满足连接的任何条目,除非您为该url_id插入了一行。