贝利信息

SQL 如何检测重复数据?

日期:2026-01-25 00:00 / 作者:冷炫風刃
最直接找重复行的方法是GROUP BY+HAVING:按疑似重复字段分组,用HAVING COUNT(*)>1筛选重复组;若需列出所有重复行,可用ROW_NUMBER()窗口函数标记并过滤rn>1的记录。

用 GROUP BY + HAVING 找出重复的行

最直接的办法是把可能重复的字段组合起来分组,再统计每组出现次数。只要数量大于 1,就是重复数据。

示例:查出所有重复的邮箱

SELECT email, COUNT(*) AS cnt
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

用窗口函数 ROW_NUMBER() 标记重复记录

当你要完整列出所有重复行(包括区分“第几次出现”),ROW_NUMBER()COUNT() 更灵活。它按指定顺序给每行编号,相同值的行会得到不同序号,方便筛选或去重。

示例:标记并查出所有重复邮箱的后续记录

SELECT *
FROM (
  SELECT *,
         ROW_NUMBER() OVER (P

ARTITION BY email ORDER BY id) AS rn FROM users ) t WHERE t.rn > 1;

用 EXISTS 或 IN 快速判断某条记录是否重复

如果你只是想校验单条记录(比如插入前检查),没必要扫全表。用 EXISTS 效率更高,尤其有索引时。

示例:检查邮箱 'test@example.com' 是否已存在(且不是当前正在编辑的用户)

SELECT EXISTS (
  SELECT 1 FROM users 
  WHERE email = 'test@example.com' 
    AND id != 123
) AS is_duplicate;

唯一约束比查询更可靠,但无法回溯历史重复

靠 SQL 查询找重复,本质是补救。真正防重复,得靠数据库层约束。不过加约束前必须先清理已有重复,否则会失败。

加约束前务必先跑一遍 GROUP BY 查重,不然 ALTER TABLE 会直接报错中断。