zoukankan      html  css  js  c++  java
  • MySQL数据库删除重复数据

    关于删除表中多余的重复记录,网上大多数都是用这种方法来处理的

    如图是测试表的数据,要去掉one,two,three三列都重复的记录,只保留一条,也就是说要将最后两条记录删除掉

    网上常用的SQL语句:

    1 DELETE
    2 FROM
    3     testdelete
    4 WHERE
    5     (one, two, three) IN (SELECT one, two, three FROM testdelete GROUP BY one, two, three HAVING COUNT(*) > 1)
    6 AND id NOT IN (SELECT MIN(id) FROM testdelete GROUP BY one, two, three HAVING COUNT(*) > 1)

    这个语句在Oracle 和SQL Server中能运行,但是MySQL执行的时候不能成功,会提示如下错误

    这句话的意思是不能对进行查询操作的表进行update操作,也就说我们的where条件中进行了子查询,
    并且子查询也是针对需要进行update操作的表的,mysql不支持这种查询修改的方式。

    所以,我们只要查询和修改的不是同一个表就行了或者两者有先后顺序,当查询完成后在对其进行删除操作,这样就可以

    避免错误的发生。

    第一种方式我采用了内嵌视图的方法来完成删除重复记录的操作

    使用视图来将查询和修改分开,使其不再同时操作一张表,参见如下SQL语句

     1 DELETE
     2 FROM
     3     testdelete
     4 WHERE
     5     id IN (
     6         SELECT
     7             id
     8         FROM
     9             (
    10                 SELECT
    11                     id
    12                 FROM
    13                     testdelete
    14                 WHERE
    15                     (one, two, three) IN (SELECT one, two, three FROM testdelete GROUP BY one, two, three HAVING count(*) > 1)
    16                 AND id NOT IN (SELECT min(id) FROM testdelete GROUP BY one, two, three HAVING count(*) > 1)
    17             ) AS deleteview
    18     )

    第二种方式我写了个存储过程来完成删除重复记录的操作

    先将重复记录数查询出来,然后用一个循环语句删除重复记录来达到去重的效果

    DELIMITER $
    CREATE DEFINER=`root`@`localhost` PROCEDURE `function_delete`()
    BEGIN
        DECLARE count INT;
        DECLARE deleteid INT;
        DECLARE i INT;
        SET i = 0;
        SELECT COUNT(*)INTO count from testdelete where (one,two,three) IN
        (SELECT one,two,three FROM testdelete GROUP BY one,two,three HAVING COUNT(*)>1) 
        AND id NOT IN (SELECT MIN(id) FROM testdelete GROUP BY one,two,three HAVING COUNT(*)>1);
        
        WHILE i < count do 
        SELECT id INTO deleteid
        from testdelete where (one,two,three) IN
        (SELECT one,two,three FROM testdelete GROUP BY one,two,three HAVING COUNT(*)>1) 
        AND id NOT IN (SELECT MIN(id) FROM testdelete GROUP BY one,two,three HAVING COUNT(*)>1) LIMIT 1;
        DELETE FROM testdelete where id = deleteid;
        set i = i+1;
        end while;
    END$
    DELIMITER ;
  • 相关阅读:
    YTU 2928: 取不重复的子串。
    YTU 2922: Shape系列-8
    YTU 2920: Shape系列-7
    STL stl_config.h
    STL defalloc.h
    STL stl_alloc.h
    STL memory.cpp
    STL stl_construct.h
    STL stl_uninitialized.h
    stl_iterator.h
  • 原文地址:https://www.cnblogs.com/leilong/p/8268979.html
Copyright © 2011-2022 走看看