我有一张表 Stores
和一张表 Schools
。这是一对多的关系——同一家商店可以为多所学校提供服务,但反之则不行。
在开发的早期,我犯了在 Stores
数据库中多次重复同一个商店的错误。我插入的行如下:
Store_ID| Store_URL
1 | http://sameurl.com
2 | http://sameurl.com
如果同一家商店有两所不同的学校,我会在一个学校行中引用 1
,在另一行中引用 2
。
通过在 Store_URL
上使用 GROUP BY
并使用 COUNT()
来识别重复项,我能够很容易地识别重复项。
摆在我面前的艰巨任务是让所有 School
指向非重复的 Stores
。如果我简单地删除重复的 Stores
,我将得到指向不存在的行的 Schools
。
我该怎么做才能消除重复项并使共享同一商店的学校指向同一 Store
行?
注意:有成千上万的学校和商店。手动解决方案不起作用。
最佳答案
假设您的 School
表有一个来自您所说的 store_ID
。
首先,我会为每个副本找出您要保留的 store_ID
。我还将假设您希望它是最低的 ID 值。然后,我会将 School
的 store_ID
更新为他们拥有的当前 URL 的 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
如果您只想删除 Store 的重复记录,我会查看此查询而不是上面的查询:
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
关于mysql - 删除 MySQL 数据库中重复的外键行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110165/