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

标签 mysql sql relational-database

我有一张表 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 值。然后,我会将 Schoolstore_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/

相关文章:

mysql - SQL 计数、求和和分组依据

基于学年的 PHP 和 MySQL 存档

sql - 小表上没有索引?

android - 如何与三个表建立关系,SugarOrm

mysql - 当where子句中有两个过滤器时显示数据pdo mysql

PHP MySql json 编码数组

php - 如何使用mysql查询在php中显示毫秒

sql - 从返回引用游标记录的函数中获取

java - SQL/JAVA JDBC通讯链接偶尔出现错误

sql - 获取 1 :n database relations into code 的最佳实践