一尘不染

重命名sql中的重复数据

mysql

我可以使用此查询找出重复的数据

   SELECT names FROM group GROUP BY names HAVING count(*) > 1

我能够获取重复数据。我只需要知道如何使用名称将重复数据重命名为 new

  INPUT
+-----------------+               
| names           |
+-----------------+
| text1           |
| text2           |
| text3           |
| text1           |
| text3           |
| text4           |
+-----------------+

OUTPUT  
+-----------------+
| names           |
+-----------------+ 
| text1           |
| text2           |
| text3           |
| text1 new value |->RENAMED
| text3 new value |->RENAMED
| text4           |
+-----------------+

阅读 289

收藏
2020-05-17

共1个答案

一尘不染

假设您在表上有某种主键,例如自动增量ID,则可以执行以下操作。

UPDATE group 
SET names = CONCAT(names,' Copy 1')
WHERE ID IN
(
SELECT MAX(ID) 
FROM group 
GROUP BY names 
HAVING count(*) > 1
);

为了说明,它将查找重复的任何内容,为该集中的所有内容获取最大ID,并在其末尾附加“副本1”。如果您有3次或多次使用某些名称,则可能仍会留下一些重复项。只需再次运行它,这次使用“副本2”而不是“副本1”。继续重复此过程,直到消除所有重复项。

更新。要从@Yahia借用一个想法并使用UUID,如果要在一个查询中全部完成,可以执行以下操作。

UPDATE group 
SET names = CONCAT(names, CONCAT ( ' Copy ', UUID_SHORT() ) )
WHERE 
ID NOT IN
(
SELECT MIN(ID) 
FROM group 
GROUP BY names 
HAVING count(*) > 1
) AND
ID IN
(
SELECT ID
FROM group AS G1
INNER JOIN group AS G2
ON G1.names = G2.names AND G1.ID <> G2.ID
);
2020-05-17