mysql 删除表里重复的数据,只留下一条记录

解决思路

1.首先判断哪些是重复记录。
2.拿出重复记录中的一条。
3.删除这条记录。

思路实现过程及遇到问题

1.首先判断哪些是重复记录。

SELECT
            itemID,Id
        FROM
            people
        GROUP BY
            itemID
        HAVING
            count(1) > 1

2.拿出重复记录中的一条。

SELECT
        min(Id)
    FROM
        people
    GROUP BY
        itemID
    HAVING
        count(1) > 1

3.删除这条记录。

DELETE
FROM
    people
WHERE
    Id IN (
        SELECT
            itemID,Id
        FROM
            people
        GROUP BY
            itemID
        HAVING
            count(1) > 1
    )
AND Id NOT IN (
    SELECT
        min(Id)
    FROM
        people
    GROUP BY
        itemID
    HAVING
        count(1) > 1
)

这时,Navicat报错为:

You can't specify target table 't_map_hll_order' for update in FROM clause

意思就是说你不能在一张表里查出数据,再删除这张表的数据。
然后又思考别的方法,就用了一个比较笨的方法:
1.先把重复数据的一条的id存到另一张表。

INSERT into t_id (id)
(SELECT MIN(Id)
from t_map_hll_mark
GROUP BY itemID)

2.从新表中读出id作为依据删除原表的数据。

DELETE
FROM
    people
WHERE
     id in (
    SELECT
        id
    FROM
        t_id
)

注意

1.在对数据库进行删除或者更新操作的时候最好开启事务。
2.上面我遇到的问题只有在mysql中有,MSSQL和Oracle不会出现此问题。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值