找到并重命名重复项

时间:2018-03-20 11:10:51

标签: mysql sql

现有baz表:

+----+-------+
| id | label |
+----+-------+
|  1 | foo   |
+----+-------+
|  2 | foo   |
+----+-------+
|  3 | bar   |
+----+-------+

目标是:

  • 通过向UNIQUE列添加label索引来更改表格;
  • 找到并重命名重复的label字段;

注意:我想避免复制该表,因为它可能有数千个唯一字段,而只有2-3个重复字段。

注2:我想使用id作为重命名标签的后缀,例如,第二foo成为foo_2

添加索引:

ALTER TABLE baz ADD UNIQUE (label);

现在找到并重命名重复项的最佳方法是什么?

编辑:我想:

UPDATE (SELECT label, COUNT(*) c FROM baz GROUP BY label HAVING c > 1) t 
SET t.label = (t.label + t.id);

UPDATE baz t1 INNER JOIN baz t2
SET t2.label = t2.label + t2.id 
WHERE t1.label = t2.label;

基本上它会:

  1. 使用SELECT查询获取重复项;
  2. 处理查询并设置label的值,例如标签+ id ;

1 个答案:

答案 0 :(得分:2)

在MySQL中,您可以使用变量添加后缀:

set @l = '';
set @rn = 0;

update baz
    set label = concat_ws('_', label,
                          if(@l = label, @rn := @rn + 1,
                             nullif(if(@l := label, @rn := 0, @rn := 0), 0)
                            )
                         )
    order by label, id;