更新子表中的parentID并从父表中删除重复的行

时间:2013-09-08 16:41:47

标签: mysql sql sql-update parent-child

我有2个 mysql 表:

位置

  • id_location
  • 城市

location_geo

  • ip_start
  • ip_end
  • id_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字段应更新为位置表中的第一个可用ID,以便显示示例中的结果:

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

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

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分: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上的索引。