最稳删重复记录的方式是用ROW_NUMBER()窗口函数:先按重复字段分组并按ID升序编号,再删除序号>1的行;MySQL 8.0+、PostgreSQL、SQL Server、Oracle支持,但MySQL 5.7及以下不支持,需改用自连接方案。用 ROW_NUMBER() 窗口函数定位重复行直接删重复记录最稳的方式,是先给每组数据打上序号,再把序号大于 1 的删掉。MySQL 8.0+、PostgreSQL、SQL Server、Oracle 都支持 ROW_NUMBER(),但旧版 MySQL(5.7 及之前)不支持——这点必须确认清楚,否则会报 ERROR 1064。关键点在于 PARTITION BY 要覆盖所有判定“重复”的字段,ORDER BY 决定哪条被保留(通常选 id 或时间字段升序,保留最早那条):DELETE t1 FROM users t1INNER JOIN users t2 ON t1.email = t2.email AND t1.id > t2.id;上面这种自连接写法在小表上可行,但大数据量时容易锁表、执行慢;而窗口函数方案更直观可控:ROW_NUMBER() OVER (PARTITION BY email, phone ORDER BY id ASC) —— 按业务唯一性字段分组,按主键升序,确保最小 id 是第 1 行别在 WHERE 里直接写窗口函数,得套一层子查询或 CTE,否则报 Window function is not allowed in WHERE clausePostgreSQL 和 SQL Server 支持在 DELETE 中用 CTE,MySQL 8.0+ 也支持,但语法略有差异:MySQL 要用 DELETE FROM tbl USING cte 形式MySQL 5.7 兼容方案:依赖自连接 + 最小 ID 保留老版本 MySQL 没窗口函数,只能靠自连接找“非最小 id 的重复行”。核心逻辑是:对每个重复组,找出所有比该组最小 id 大的记录,然后删掉。常见错误是只写 GROUP BY 却忘了关联原表,导致删错或删不全: Murf AI AI文本转语音生成工具

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐