MySQL更新重复记录

时间:2016-06-30 14:35:45

标签: mysql

我甚至不确定在查询中这是可行的,但是这里有。我正在清理第三方进入我们系统的数据。他们为一个组中的每个人创建一个不那么独特的唯一字符串,该字符串包含名字的前3个字母,然后是yyyymmdd格式的dob。在少数重复的内容中,我想在该ID上附加-1,-2,-3等,这样它们才真正是唯一的。

JOH19700101     0001    JOHN SMITH    1970-01-01
JOH19700101     0001    JOHNSON SMITH 1970-01-01
JOH19700101     0002    JOHN SMITH    1970-01-01

在上面,前两个ID(JOH19700101)需要附加-1和-2,因为它们在同一组(0001)中。第三个可以保持与他在不同组中的相同(0002)。

选择重复项很容易:

SELECT x.id, x.uid, x.group, x.name, x.dob
FROM import x
INNER JOIN (
    SELECT uid
    FROM import
    GROUP BY group, uid
    HAVING COUNT(uid) > 1) z ON x.uid = z.uid;

有没有办法为此添加更新,以便前两个样本分别获得JOH19700101-1和JOH19700101-2的新UID?

1 个答案:

答案 0 :(得分:1)

这将为您提供独特的uid值,尽管它可以从一个小的改进中受益。现在,附加的数字会不断增加,所以你的第一对dupes会在其uid上附加-1和-2,然后是下一对-3和-4,依此类推。

应该可以以某种方式重置@inc,但是这样可以确保所有的uid值都是唯一的,并且不同组中的相同uid将保持不变。

SET @inc :=0;

UPDATE 
 `import` i
       JOIN (
   SELECT uid, `group`
   FROM `import`
      GROUP BY `group`, uid
   HAVING COUNT(uid) > 1) d ON 
  i.uid = d.uid AND 
  i.group = d.group

SET
  i.uid = CONCAT(i.uid, '-',@inc:=@inc+1)