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不会出现此问题。

猜你喜欢

转载自blog.csdn.net/tang_xiaotang/article/details/81112180