MySQL 重复数据删除语句

方案 1:有自增主键 id(推荐,最安全)

假设你的表有主键:id(没有就用方案 2)

复制代码
DELETE a
FROM leave_sdxw a
JOIN (
    -- 找出每组重复数据中 最小的id之外的所有记录
    SELECT tenant_id, sddm, fill_vpdm, MIN(id) AS keep_id
    FROM leave_sdxw
    WHERE fill_vpdm IS NOT NULL
    GROUP BY tenant_id, sddm, fill_vpdm
    HAVING COUNT(*) > 1
) b ON a.tenant_id = b.tenant_id 
   AND a.sddm = b.sddm 
   AND a.fill_vpdm = b.fill_vpdm 
   AND a.id > b.keep_id; -- 只删大于最小id的重复数据

方案 2:没有主键 / 唯一列(不推荐,但能用)

复制代码
-- 先创建临时表存储重复组合
CREATE TEMPORARY TABLE tmp_repeat AS
SELECT tenant_id, sddm, fill_vpdm
FROM leave_sdxw
WHERE fill_vpdm IS NOT NULL
GROUP BY tenant_id, sddm, fill_vpdm
HAVING COUNT(*) > 1;

-- 删除重复(会每组只留一条,取决于数据库存储顺序)
DELETE a
FROM leave_sdxw a
JOIN tmp_repeat b 
ON a.tenant_id = b.tenant_id 
AND a.sddm = b.sddm 
AND a.fill_vpdm = b.fill_vpdm;

-- 删除临时表
DROP TEMPORARY TABLE IF EXISTS tmp_repeat;

执行前建议 先执行查询确认要删的数据,不要直接删

复制代码
-- 先查询,确认重复数据
SELECT a.*
FROM leave_sdxw a
JOIN (
    SELECT tenant_id, sddm, fill_vpdm, MIN(id) AS keep_id
    FROM leave_sdxw
    WHERE fill_vpdm IS NOT NULL
    GROUP BY tenant_id, sddm, fill_vpdm
    HAVING COUNT(*) > 1
) b ON a.tenant_id = b.tenant_id 
   AND a.sddm = b.sddm 
   AND a.fill_vpdm = b.fill_vpdm 
   AND a.id > b.keep_id;

总结

  1. 优先用方案 1(带主键 id),安全、高效、不会删光数据
  2. 执行删除前一定要先查询预览
相关推荐
guodingdingh2 小时前
软件开发工作问题总结0718
java·开发语言·数据库
GuWenyue4 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
Miao121316 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
CodexDave6 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
碎光拾影6 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
曾阿伦6 小时前
MongoDB 查询语句备忘手册
数据库·mongodb
一叶龙洲7 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
CCPC不拿奖不改名7 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
爬也要爬着前进8 小时前
redis主从搭建
数据库·redis·缓存
@Mike@9 小时前
02-数据库学习笔记(SQL引擎)
数据库·笔记·学习