解决MySQL Error Code:1241 删除重复数据报错问题
解决SQL删除重复数据时的1241错误
这个报错的原因很明确:IN子句要求子查询返回单一列,但你写的子查询select empno,count(*) from dupp group by empno having count(*)>1同时返回了empno和计数两列,数据库无法进行匹配判断,因此抛出1241错误。
以下是几种实现删除重复数据的正确方法:
方案1:删除重复项,保留每个empno的一条记录(推荐)
如果需要保留重复数据中的某一条(比如主键最小、创建时间最早的记录),可以用以下方式:
当表有主键(比如id)时:
-- 先验证要删除的记录(建议先执行,避免误删) SELECT * FROM dupp WHERE id NOT IN ( SELECT MIN(id) FROM dupp GROUP BY empno ); -- 确认无误后执行删除 DELETE FROM dupp WHERE id NOT IN ( SELECT MIN(id) FROM dupp GROUP BY empno );
当表无主键(MySQL 8.0+支持窗口函数)时:
WITH ranked_dups AS ( SELECT empno, ROW_NUMBER() OVER (PARTITION BY empno ORDER BY empno) AS rn FROM dupp ) -- 先验证要删除的记录 SELECT d.* FROM dupp d JOIN ranked_dups rd ON d.empno = rd.empno WHERE rd.rn > 1; -- 执行删除 DELETE d FROM dupp d JOIN ranked_dups rd ON d.empno = rd.empno WHERE rd.rn > 1;
方案2:删除所有重复的empno记录(一条都不保留)
如果不需要保留任何重复的empno数据,只需修改原语句,让子查询只返回empno列即可:
-- 先验证要删除的记录 SELECT * FROM dupp WHERE empno IN ( SELECT empno FROM dupp GROUP BY empno HAVING COUNT(*) > 1 ); -- 执行删除 DELETE FROM dupp WHERE empno IN ( SELECT empno FROM dupp GROUP BY empno HAVING COUNT(*) > 1 );
注意事项
- 执行删除操作前,务必先备份数据,或者用
SELECT语句先验证要删除的记录范围,避免误删。 - 如果是InnoDB引擎,删除大量数据后建议执行
OPTIMIZE TABLE dupp来释放存储空间。
内容的提问来源于stack exchange,提问作者maxe magesh
相关产品推荐
相关产品推荐

