删除MySQL数据库中的重复外键行

时间:2011-11-13 07:05:41

标签: mysql sql relational-database

我有一张表Stores和一张表Schools。这是一对多关系 - 多个学校可以由同一个商店提供服务,但反之亦然。

在开发早期,我错误地在Stores数据库中多次重复同一个商店。我插入了如下行:

Store_ID| Store_URL
1       | http://sameurl.com
2       | http://sameurl.com

如果两个不同的学校在同一家商店,我会在一个学校行引用1,在另一个学校行引用2

我可以使用GROUP BY上的Store_URL并使用COUNT()来识别重复项,从而轻松识别重复项。

我面前的艰巨任务是让所有Schools指向非重复Stores。如果我只删除重复的Stores,我会Schools指向不存在的行。

如何消除重复并让共享同一商店的学校指向同一Store行?

注意:有数千所学校和商店。手动解决方案不起作用。

2 个答案:

答案 0 :(得分:6)

假设您的School表格中有store_ID来自您所说的内容。

我首先要弄清楚每个副本,你想要保留store_ID。我还假设您希望它是最低的ID值。然后,我会将School s'store_ID更新为他们当前网址的MIN(store_ID)。然后,您应该可以自由删除额外的store_ID条记录

这就是我要进行更新的方式:

UPDATE sch
SET sch.Store_ID = matcher.store_ID
FROM Schools AS sch
INNER JOIN Stores AS st ON sch.store_ID = st.store_ID
INNER JOIN
(
   SELECT MIN(st.store_id) AS store_ID, store_url
   FROM Schools AS sch
   INNER JOIN Stores AS st ON sch.store_ID = st.store_ID
   GROUP BY Store_URL
) AS matcher ON st.Store_URL = matcher.Store_Url
   AND st.Store_ID != matcher.store_ID

如果您能够删除没有关联学校的商店,以下查询将删除额外的行:

DELETE FROM st
FROM Stores AS st
LEFT JOIN Schools AS sch ON st.Store_ID = sch.Store_Id
WHERE sch.Store_id IS NULL

如果您只想删除商店的重复记录,我会查看此查询而不是上述内容:

DELETE FROM st
FROM Stores AS st
INNER JOIN
(
   SELECT MIN(st.store_ID) store_Id, st.Store_Url
   FROM Stores AS st
   GROUP BY st.Store_URL
) AS useful ON st.Store_Url = useful.Store_URL
WHERE st.Store_ID != useful.store_Id

答案 1 :(得分:0)

以下更新语句将更改一所学校数据库中的值:

UPDATE Schools SET store_id = 1 WHERE store_id = 2;
DELETE FROM Stores WHERE Store_ID = 2;
相关问题