如何删除重复的行并更新表格

5

我的表格中存在重复的行。

我有两个表格,它们由外键连接在一起。

regions (id)
orders (region_id)

这些区域名称是重复的。我希望删除这些重复的行并更新订单表。重复的外键现在将被设置为区域表中仅剩下的现有名称。

例如:

regions table:

id  name
1 | test
2 | test
3 | foo

orders table:

id region_id
6 | 1
7 | 2
9 | 3

I want

orders table:

id region_id
6 | 1
7 | 1
9 | 3

regions table:

id  name
1 | test
3 | foo

我可以使用以下SQL查询获取重复的行:

SELECT name, count(id) as cnt FROM regions 
GROUP BY name HAVING cnt > 1

我该如何将这个选择器与订单表连接起来,并删除重复行并更新表格?


重复记录保存的逻辑是什么?我假设是第一个(即最低主键)。您是否可以访问其他技术?直接使用MySQL可能更难实现。 - Jason McCreary
1
Lukas,这不仅仅是删除行。我需要更新外键! - senzacionale
1个回答

5

要更新订单表,可以类似以下方式:

update  orders
join    regions r1
on      r1.id = orders.region_id
set     orders.region_id = 
        (
        select  min(r2.id)
        from    regions r2
        where   r2.name = r1.name
        )

之后,您可以使用以下命令删除重复行:

delete  regions
from    regions
where   id not in
        (
        select  id
        from    (
                select  min(id) as id
                from    regions
                group by
                    name
                ) as SubqueryAlias
        )

为避免 MySQL 错误 ERROR 1093 (HY000) at line 36: You can't specify target table 'regions' for update in FROM clause,需要进行双重子查询。

谢谢你的帮助。我不知道这需要双子查询。 - senzacionale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接