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. 执行删除前一定要先查询预览
相关推荐
zfoo-framework1 天前
通过redis-cli+lua脚本查询redis数据
数据库·redis·lua
牛栓柱1 天前
【后端实战】用 Supabase + React/TS 零成本构建高并发 Multi-Agent 服务
前端·数据库·人工智能·后端·react.js·前端框架
yuezhilangniao1 天前
xtr备份prepare到底变化了啥
mysql
yyk的萌1 天前
创建属于自己的mysql的mcp
mysql·adb·ai·mcp
流烟默1 天前
腾讯云Centos7.6使用yum安装MySQL8
mysql·centos·腾讯云
仙俊红1 天前
如何优化 MySQL 深分页 SQL
android·sql·mysql
yyuuuzz1 天前
谷歌云基础服务的入门认知
linux·运维·服务器·数据库·人工智能·github
超梦dasgg1 天前
工作中 MySQL 读写分离主从延迟:成因、影响、落地方案、生产实战处理
数据库·mysql
Wonderful U1 天前
Python+Django实战:打造智能生鲜果蔬进销存管理系统(采购入库、库存预警、销售开单、毛利统计)
数据库·python·django
Demon1_Coder1 天前
Day4-微服务-Seata默认事务
java·数据库·微服务