如何在MySQL中按key分组为同组行更新相同UUID值
MySQL实现按Key批量生成统一UUID的方案
问题场景
现有test表数据如下:
| name | key | uuid |
|---|---|---|
| na1 | k1 | NULL |
| na2 | k2 | NULL |
| na3 | k1 | NULL |
需求:相同key的行共用同一个UUID,唯一key的行使用独立UUID,最终效果如下:
| name | key | uuid |
|---|---|---|
| na1 | k1 | 8274e89f-b119-4326-814d-4a864bbbe207 |
| na2 | k2 | 9a6c5f68-a3c2-4250-ac31-cc8c86a6440c |
| na3 | k1 | 8274e89f-b119-4326-814d-4a864bbbe207 |
已知PostgreSQL的CTE实现方式,需要转换为MySQL写法。
解决方案
MySQL 8.0+版本(支持CTE)
WITH cte AS ( SELECT `key`, UUID() AS uuid FROM test GROUP BY `key` ) UPDATE test JOIN cte ON test.`key` = cte.`key` SET test.uuid = cte.uuid;
MySQL 5.x版本(不支持CTE)
用子查询替代CTE:
UPDATE test JOIN ( SELECT `key`, UUID() AS uuid FROM test GROUP BY `key` ) AS cte ON test.`key` = cte.`key` SET test.uuid = cte.uuid;
代码说明
- 先通过
GROUP BY key获取所有唯一的key值,为每个key生成一次UUID,确保同key的行共用同一个值。 - MySQL的UPDATE语句使用
JOIN关联原表和生成的UUID映射集,替代PostgreSQL的FROM语法,完成批量更新。
内容的提问来源于stack exchange,提问作者Attiq Ahmed
相关产品推荐
相关产品推荐

