使用另一个表中的外键从一个表中删除重复记录

时间:2015-06-01 11:55:53

标签: mysql

我有一张桌子'导演'和另一张表' company_directors'

在导演表格中有重复的记录,其中包含相同的"全名",我想选择最长的"地址"。

我想更新外键" directorID"在' company_directors'表

我曾尝试使用GROUP BY,但我无法指定要保留哪些副本...我也不知道如何更新外键记录以反映所选的' DIRECTOR_ID'重复。

更新

我已经能够通过改变“导演”来将重复记录标记为非活动状态。表并添加“活跃”表格柱。
但是我仍然想要更正" company_directors'表,在删除非活动/重复记录之前。

1 个答案:

答案 0 :(得分:0)

如果您想就地执行此操作,请先更新第二个表。

update company_directors cd join
       directors d
       on cd.DirectorId = d.DirectorId join
       (select fullname,
               substring_index(group_concat(directorId order by length(Address) desc), ',', 1) as newDirectorId
        from directors
        group by fullname
       ) dnew
       on d.fullname = dnew.fullname
    set cd.DirectorId = dnew.newDirectorId
    where dnew.newDirectorId = d.DirectorId;

然后,通过删除不感兴趣的导演来更新directors

delete cd
    from directors d left join
         cd.DirectorId = d.DirectorId join
         (select fullname,
                 substring_index(group_concat(directorId order by length(Address) desc), ',', 1) as newDirectorId
          from directors
          group by fullname
         ) dnew
         on d.fullname = dnew.fullname and d.directorId = dnew.newDirectorId
    where dnew.newDirectorId is null;

我对此方法并不感到兴奋,因为newDirectorId(在两个查询中)最终都是字符串而不是数字。但是,MySQL不支持窗口函数,因此这可能是最简单的方法。

那就是说,我鼓励你采取略微不同的方法。首先,在执行任何操作之前备份表。

然后,添加一个表示记录是否有效的标志,而不是从directors删除。然后,使用较短地址的记录无效。调查结果,以确保它们是你想要的。手动更改不正确的标志。然后,返回company_directors表并修复指向非活动记录的记录。