mysql - 如何在 mysql 中将重复行更改为唯一值?

标签 mysql unique

我有一个包含大约 1M 条记录的数据库表。我需要在此表中找到所有重复的名称并使它们唯一。

例如……

Id   Name
-----------
1    A
2    A
3    B
4    C
5    C

应该改为...

Id   Name
-----------
1    A-1
2    A-2
3    B
4    C-1
5    C-2

是否有使用 mysql 查询或过程执行此操作的有效方法?

提前致谢!

最佳答案

这有点棘手。我在本地主机上进行了测试,它可以满足您的要求。如果您有任何问题,请告诉我。 SQL FIDDLE

UPDATE temp t1, 
(
    SELECT 
        id as unique_id, 
        new_name 
    FROM(
        SELECT
          id,
          IF(@ROW = Name, @COUNT, @COUNT := 1),
          CONCAT(Name, ' - ', @COUNT) AS new_name,
          @ROW := Name,
          @COUNT := @COUNT + 1
        FROM temp
        JOIN (SELECT @COUNT := 0, @ROW := "") AS t
        WHERE Name IN(SELECT Name FROM temp
        GROUP BY Name
        HAVING COUNT(Name) > 1)
    ) AS temp_test
) as testing
SET t1.Name = testing.new_name where t1.id = testing.unique_id

最终输出如下所示:PICTURE


编辑: 为了性能起见,这可能会更好

1.首先运行这个查询

SET SESSION group_concat_max_len = 1000000;  -- longer if needed
SET @query1 := (
SELECT 
    GROUP_CONCAT(DISTINCT unique_name) 
FROM temp
JOIN(
    select Name as unique_name
    FROM temp
    GROUP BY name
    HAVING COUNT(Name) > 1
) as t
);

2. 然后运行此更新

UPDATE temp t1, 
(
    SELECT 
        id as unique_id, 
        new_name 
    FROM(
        SELECT
          id,
          IF(@ROW = Name, @COUNT, @COUNT := 1),
          CONCAT(Name, ' - ', @COUNT) AS new_name,
          @ROW := Name,
          @COUNT := @COUNT + 1
        FROM temp
        JOIN (SELECT @COUNT := 0, @ROW := "") AS t
        WHERE FIND_IN_SET (`name`, @query1)
    ) AS temp_test
) as testing
SET t1.Name = testing.new_name where t1.id = testing.unique_id

我在我的本地测试了这个并且它有效所以你应该能够让它运行:)

关于mysql - 如何在 mysql 中将重复行更改为唯一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10957000/

相关文章:

javascript - jQuery 'unique' 在 Safari 中不返回实际的唯一值

c++ - 判断vector是否有重复

javascript - jQuery .now() 不是唯一的

mysql - 连接三个不同的mysql查询表

mysql - mySQL 中的标点不敏感搜索

php - 检查用户友谊

sql - 将重复的 varchars 更新为在 SQL 数据库中是唯一的

mysql - 我可以设置在 MySQL 上自动递增的 id 的默认整数值吗?

mysql - 多个值存储在 MySQL 数据库的单个列中?

sql - 在已插入非唯一值后在 PostgreSQL 表列上强制执行唯一性