生产实例:删除一个表中的重复数据,只保留id最小的mysql

本文介绍如何使用SQL语句从数据库表中删除重复记录,并保留指定条件下的唯一记录。包括单字段重复记录删除及多字段重复记录删除的方法。
#删除t_jt_contract_user表中的重复数据,只保留id最小的
DELETE FROM t_jt_contract_user WHERE userIDCard IN (SELECT a.userIDCard 
FROM(SELECT userIDCard FROM t_jt_contract_user GROUP BY userIDCard HAVING 
COUNT(userIDCard) > 1) a) AND id NOT IN (SELECT b.bid FROM(SELECT min(id) AS 
bid FROM t_jt_contract_user GROUP BY userIDCard HAVING COUNT(userIDCard) > 1) 
b);
简洁版的sql:(删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录)
delete from people 
where peopleId  in (select  peopleId  from people  group  by  peopleId   
having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having 
count(peopleId )>1)

根据多个重复字段,删除重复记录

DELETE
FROM
    `表名`
WHERE
    (重复字段1,重复字段2) IN (
        SELECT
            a.重复字段1,a.重复字段2
        FROM
            (
                SELECT
                    重复字段1,重复字段2
                FROM
                    `表名`
                GROUP BY
                    重复字段1,重复字段2
                HAVING
                    count(1) > 1
            ) AS a
    )
AND id NOT IN (
    SELECT
        b.aa
    FROM
        (
            SELECT
                min(id) AS aa
            FROM
                `表名`
            GROUP BY
                重复字段1,重复字段2
            HAVING
                count(1) > 1
        ) AS b
);
### MySQL 中基于 `jh` 和 `time` 字段去重并保留一条记录 在 MySQL 中,可以通过多种方法来实现基于特定字段(如 `jh` 和 `time`)的去重操作,并仅保留每组中的唯一记录。以下是几种常见的解决方案: #### 方法一:使用临时和 GROUP BY 实现 通过创建一个临时存储唯一的组合数据,然后再将其重新导入原。 ```sql CREATE TEMPORARY TABLE temp_table AS SELECT MIN(id) AS id -- 或者其他标识列 FROM your_table GROUP BY jh, time; DELETE FROM your_table WHERE id NOT IN ( SELECT id FROM temp_table ); DROP TEMPORARY TABLE temp_table; ``` 此方法的核心在于利用 `GROUP BY` 对指定字段分组,并选取其中的一条记录(通常是最小 ID 的那条)。随后删除不在该范围内的所有记录[^1]。 --- #### 方法二:直接 DELETE 使用 JOIN 查询 如果不想借助中间,则可以直接执行如下 SQL 语句完成相同功能: ```sql DELETE t1 FROM your_table t1 JOIN your_table t2 ON t1.jh = t2.jh AND t1.time = t2.time AND t1.id > t2.id; ``` 这里的逻辑是找到具有相同 `jh` 和 `time` 值的所有行,但只留下最小 `id` 的那一行,其余全部移除。注意此处假设有一个主键或者唯一索引列为 `id` 来区分不同行[^2]。 --- #### 方法三:ALTER IGNORE 添加 UNIQUE 约束 对于某些版本支持的情况,还可以尝试修改结构强制实施唯一约束从而达到目的: ```sql ALTER IGNORE TABLE your_table ADD UNIQUE(jh, time); ``` 不过需要注意的是,在较新的 MySQL 版本中已经废弃了 `IGNORE` 关键字,所以这种方法可能并不适用于所有环境[^3]。 --- #### 方法四:INSERT INTO ... SELECT 结合 DISTINCT 插入新 当原始格较大且难以直接在线处理时,考虑新建一张干净的数据集也是一个不错的选择: ```sql CREATE TABLE new_your_table AS SELECT DISTINCT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY jh, time ORDER BY id ASC) row_num FROM your_table ) subquery WHERE row_num = 1; -- 如果确认无误可替换旧 RENAME TABLE your_table TO old_your_table, new_your_table TO your_table; ``` 这段脚本运用窗口函数分配给每一组内部按顺序排列编号,最终挑选出首个实例保存下来[^4]。 --- 以上四种方案各有优劣,请依据实际场景需求以及数据库性能状况作出最佳抉择。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值