【问题标题】:Updating parentID in child table and deleting duplicate rows from parent table更新子表中的 parentID 并从父表中删除重复行
【发布时间】:2013-09-10 00:34:55
【问题描述】:

我有 2 个 mysql 表:

位置

  • id_location
  • 城市

location_geo

  • ip_start
  • ip_end
  • id_location

问题是location表中至少有1/4的城市是重复记录。我可以轻松地运行这个查询并删除那些重复的记录:

ALTER IGNORE TABLE location ADD UNIQUE INDEX idx (city);

这样做之前,我还必须使用唯一的城市 ID 更新 location_geo 表。例如,这是一种可能性:

位置

  • 129,洛杉矶
  • 145,纽约
  • 176,洛杉矶
  • 856,洛杉矶

location_geo

  • 16778240, 16778751, 129
  • 16817792, 16819711, 176
  • 16820992, 16822527, 129
  • 16827904、16828415、856
  • 16829440, 16832511, 145
  • 16832512, 16832639, 129

location_geo 内的 id_location 字段应更新为 location 表中的第一个可用 ID,以便示例中的结果应显示:

  • 16778240, 16778751, 129
  • 16817792, 16819711, 129
  • 16820992, 16822527, 129
  • 16827904、16828415、129
  • 16829440, 16832511, 145
  • 16832512, 16832639, 129

顺便说一句,location_geo 表中有 2,021,182 条记录。

我们将不胜感激。

【问题讨论】:

    标签: mysql sql sql-update parent-child


    【解决方案1】:

    我会分三步完成。您没有指定您的 RDBMS 类型,所以这是非常通用的语法。

    为新的location_id创建映射表:

    create table new_loc_map as
    select a.id_location as old_loc
           a.city
         , b.id_location
    from location a
    join (
       select city
            , min(id_location) as id_location
       from location
       group by city
       ) b
    on a.city=b.city
    

    更新location_geo 表:

    update location_geo
    from new_loc_map
    set location_geo.id_location=new_loc_map.id_location
    where location_geo.id_location=new_loc_map.old_loc
    

    创建一个新的location 表:

    create table new_location as
    (select distinct id_location
          , city
     from new_loc_map
     )
    unique index idx (location)
    

    您的问题描述了在 location 表上创建一个新的复合索引以删除重复项,但除非我不完全理解,否则您只需要在 location_id 上创建一个索引。

    【讨论】:

    • 嗨,问题不在于重复的行,我已经有了解决方案。问题是在删除父表中的重复行之前重新分配子表中的 id。
    • 第二步是这样做的,假设“子表”是指您的location_geo 表。
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多