我有一个包含两个表的数据库,url
和tweet
。 url
具有以下结构:
id | expanded_url | display_url | url
---------------------------------------
url
和tweet
之间存在多对多关系,因此有一个JOIN表(urls_tweets
)如下所示:
id | tweet_id | url_id
------------------------
问题是url
表中有重复的条目 - 没有正确使用唯一索引,我正在尝试清除重复项,以便我可以创建它们。我运行查询以查找url
表中的所有重复条目,并且删除它们非常容易。
现在的问题是我需要更新urls_tweets
以指向规范记录,因为正在删除重复项。当然,在urls_tweets
中,tweet_id
和url_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_id
, url_id
)对?
答案 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插入了一行。