删除重复保留一条要点
- 思路一:建临时表存去重结果,DROP 原表,RENAME 回去
- 临时表用 GROUP BY 取每组一条,结构可自定义
- 思路二:DELETE 删掉 id 不在'每组最小 id'集合里的行
- 删前务必先 SELECT 确认要删的范围,防止误伤
- 重建表方式会丢掉原表索引,记得补建
- 删除后用唯一索引兜底,避免再次产生重复
删除重复保留一条示例
-- 方法一:搬到临时表再换回
CREATE TABLE member_tmp
SELECT username, email, MAX(phone) AS phone
FROM member GROUP BY username, email;
DROP TABLE member;
ALTER TABLE member_tmp RENAME TO member;
-- 方法二:删掉每组里非最小 id 的重复行
DELETE FROM member
WHERE id NOT IN (
SELECT min_id FROM (
SELECT MIN(id) AS min_id
FROM member
GROUP BY username, email
) AS t
);
避坑提醒:用 NOT IN 子查询删副本最稳:先按重复键取每组最小 id,不在集合里的就是多余副本,整组只留最小那个。