SQL脚本编写需求:清理重复用户并更新关联Usage表
解决重复邮箱用户及Usage表关联更新问题
需求说明
清理User表中重复邮箱的冗余用户,仅保留user_id与email一致的记录;同时将Usage表中关联到冗余user_id的记录,统一更新为对应邮箱的目标user_id。
目标表现状
User表:
| user_id | |
|---|---|
| A | a@gmail.com |
| B | a@gmail.com |
| C | a@gmail.com |
| a@gmail.com | a@gmail.com |
Usage表:
| id | user_id | usage_time |
|---|---|---|
| 1 | A | 10 |
| 2 | B | 444 |
| 3 | C | 4657 |
| 4 | a@gmail.com | 6334 |
分步执行脚本
1. 更新Usage表关联记录
将所有属于a@gmail.com邮箱的Usage记录,统一把user_id更新为目标值a@gmail.com:
UPDATE Usage u JOIN User us ON u.user_id = us.user_id SET u.user_id = us.email WHERE us.email = 'a@gmail.com';
2. 删除User表冗余用户
移除a@gmail.com邮箱下user_id与邮箱不一致的冗余记录:
DELETE FROM User WHERE email = 'a@gmail.com' AND user_id != email;
通用批量处理脚本(适用于所有重复邮箱场景)
如果需要处理全表所有重复邮箱的情况,可使用以下脚本:
更新所有重复邮箱对应的Usage记录
UPDATE Usage u JOIN ( -- 先找到每个邮箱对应的目标保留user_id(即user_id与邮箱一致的记录) SELECT email, user_id AS target_user_id FROM User WHERE user_id = email ) target_us ON u.user_id IN ( SELECT user_id FROM User WHERE email = target_us.email ) SET u.user_id = target_us.target_user_id;
删除所有冗余用户
DELETE FROM User WHERE user_id != email -- 仅删除存在对应保留用户的冗余记录 AND EXISTS ( SELECT 1 FROM User us WHERE us.email = User.email AND us.user_id = us.email );
注意事项
- 执行前必须备份数据,防止误操作导致数据丢失
- 生产环境建议先在测试环境验证脚本逻辑
- 可先通过
SELECT语句预览操作结果,确认无误后再执行更新/删除:- 预览待更新的Usage记录:
SELECT u.*, us.email FROM Usage u JOIN User us ON u.user_id=us.user_id WHERE us.email='a@gmail.com'; - 预览待删除的User记录:
SELECT * FROM User WHERE email='a@gmail.com' AND user_id != email;
- 预览待更新的Usage记录:
内容的提问来源于stack exchange,提问作者laskdjf
相关产品推荐
相关产品推荐

