• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL 消除重复行的一些方法

    sql语句

    /*
    MySQL 消除重复行的一些方法
    ---Chu Minfei
    ---2010-08-12 22:49:44.660
    --引用转载请注明出处:http://blog.csdn.NET/feixianxxx
    */
    ----------------全部字段重复------------------------
     --1使用表替换来删除重复项
     create table test_1(id int,value int);
     insert test_1 select 1,2 union all select 1,2 union all select 2,3;
     --建立一个和源表结构一样的空的临时表
     create table tmp like test_1;
     --向临时表插入不重复的记录
     insert tmp select distinct * from test_1;
     --删除原表
     drop table test_1;
     --更改临时表名为目标表
     rename table tmp to test_1;
     --显示
     mysql> select * from test_1;
    +------+-------+
    | id  | value |
    +------+-------+
    |  1 |   2 |
    |  2 |   3 |
    +------+-------+
     --2.添加auto_increment属性列(这个方法只能用于MyISAM或者BDB引擎的表)
     create table test_1(id int,value int) engine=MyISAM;
     insert test_1 select 1,2 union all select 1,2 union all select 2,3;
     alter table test_1 add id2 int not null auto_increment,
     add primary key(id,value,id2);
     select * from test_1;
    +----+-------+-----+
    | id | value | id2 |
    +----+-------+-----+
    | 1 |   2 |  1 |
    | 1 |   2 |  2 |
    | 2 |   3 |  1 |
    +----+-------+-----+
      delete from test_1 where id2>1;
      alter table test_1 drop id2;
      select * from test_1;
      +----+-------+
    | id | value |
    +----+-------+
    | 1 |   2 |
    | 2 |   3 |
    +----+-------+
    -------------------部分字段重复---------------------
    --1.加索引的方式
     create table test_2(id int,value int);
     insert test_2 select 1,2 union all select 1,3 union all select 2,3;
     Alter IGNORE table test_2 add primary key(id);
     select * from test_2;
     +----+-------+
    | id | value |
    +----+-------+
    | 1 |   2 |
    | 2 |   3 |
    +----+-------+
     我们可以看到 1 3 这条记录消失了 
     我们这里也可以使用Unique约束 因为有可能列中有NULL值,但是这里NULL就可以多个了..
     --2.联合表删除
     create table test_2(id int,value int);
     insert test_2 select 1,2 union all select 1,3 union all select 2,3;
     delete A from test_2 a join (select MAX(value) as v ,ID from test_2 group by id) b
     on a.id=b.id and a.value>b.v;
     select * from test_2;
     +------+-------+
    | id  | value |
    +------+-------+
    |  1 |   3 |
    |  2 |   3 |
    +------+-------+
    --3.使用Increment_auto也可以就是上面全部字段去重的第二个方法
    --4.容易错误的方法
    --有些朋友可能会想到子查询的方法,我们来试验一下
     create table test_2(id int,value int);
     insert test_2 select 1,2 union all select 1,3 union all select 2,3;
     delete a from test_2 a where exists(select * from test_2 where a.id=id and a.valuevalue);
     /*ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause*/
     
     目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。
     
     
     ------------------删除特定重复行--------------
     --主要通过order by +limit 或者直接limit 
     create table test_3(id int,value int);
     insert test_3 select 1,2 union all select 1,3 union all select 1,4 union all select 2,3;
     --这是要保留ID=1 value最小的那个记录,删除其他id为的记录
     delete from test_3 where id=1 order by value desc limit 2;
     select * from test_3;
    +------+-------+
    | id  | value |
    +------+-------+
    |  1 |   2 |
    |  2 |   3 |
    +------+-------+
     如果你只想删除任意的记录 保留一条 就可以去掉order by 

    您可能感兴趣的文章:
    • mysql删除重复行的实现方法
    • Mysql数据库支持的存储引擎对比
    • MySQL带你秒懂索引下推
    • MySQL 如何查找删除重复行
    上一篇:mysql查询表里的重复数据方法
    下一篇:MySQL使用变量实现各种排序
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL 消除重复行的一些方法 MySQL,消除,重复,行的,一些,