• 售前

  • 售后

热门帖子
入门百科

MySQL 消除重复行的一些方法

[复制链接]
豆芽角角123 显示全部楼层 发表于 2021-10-25 18:46:15 |阅读模式 打印 上一主题 下一主题
sql语句
  1. /*
  2. MySQL 消除重复行的一些方法
  3. ---Chu Minfei
  4. ---2010-08-12 22:49:44.660
  5. --引用转载请注明出处:http://blog.csdn.NET/feixianxxx
  6. */
  7. ----------------全部字段重复------------------------
  8. --1使用表替换来删除重复项
  9. create table test_1(id int,value int);
  10. insert test_1 select 1,2 union all select 1,2 union all select 2,3;
  11. --建立一个和源表结构一样的空的临时表
  12. create table tmp like test_1;
  13. --向临时表插入不重复的记录
  14. insert tmp select distinct * from test_1;
  15. --删除原表
  16. drop table test_1;
  17. --更改临时表名为目标表
  18. rename table tmp to test_1;
  19. --显示
  20. mysql> select * from test_1;
  21. +------+-------+
  22. | id  | value |
  23. +------+-------+
  24. |  1 |   2 |
  25. |  2 |   3 |
  26. +------+-------+
  27. --2.添加auto_increment属性列(这个方法只能用于MyISAM或者BDB引擎的表)
  28. create table test_1(id int,value int) engine=MyISAM;
  29. insert test_1 select 1,2 union all select 1,2 union all select 2,3;
  30. alter table test_1 add id2 int not null auto_increment,
  31. add primary key(id,value,id2);
  32. select * from test_1;
  33. +----+-------+-----+
  34. | id | value | id2 |
  35. +----+-------+-----+
  36. | 1 |   2 |  1 |
  37. | 1 |   2 |  2 |
  38. | 2 |   3 |  1 |
  39. +----+-------+-----+
  40.   delete from test_1 where id2<>1;
  41.   alter table test_1 drop id2;
  42.   select * from test_1;
  43.   +----+-------+
  44. | id | value |
  45. +----+-------+
  46. | 1 |   2 |
  47. | 2 |   3 |
  48. +----+-------+
  49. -------------------部分字段重复---------------------
  50. --1.加索引的方式
  51. create table test_2(id int,value int);
  52. insert test_2 select 1,2 union all select 1,3 union all select 2,3;
  53. Alter IGNORE table test_2 add primary key(id);
  54. select * from test_2;
  55. +----+-------+
  56. | id | value |
  57. +----+-------+
  58. | 1 |   2 |
  59. | 2 |   3 |
  60. +----+-------+
  61. 我们可以看到 1 3 这条记录消失了
  62. 我们这里也可以使用Unique约束 因为有可能列中有NULL值,但是这里NULL就可以多个了..
  63. --2.联合表删除
  64. create table test_2(id int,value int);
  65. insert test_2 select 1,2 union all select 1,3 union all select 2,3;
  66. delete A from test_2 a join (select MAX(value) as v ,ID from test_2 group by id) b
  67. on a.id=b.id and a.value<>b.v;
  68. select * from test_2;
  69. +------+-------+
  70. | id  | value |
  71. +------+-------+
  72. |  1 |   3 |
  73. |  2 |   3 |
  74. +------+-------+
  75. --3.使用Increment_auto也可以就是上面全部字段去重的第二个方法
  76. --4.容易错误的方法
  77. --有些朋友可能会想到子查询的方法,我们来试验一下
  78. create table test_2(id int,value int);
  79. insert test_2 select 1,2 union all select 1,3 union all select 2,3;
  80. delete a from test_2 a where exists(select * from test_2 where a.id=id and a.value<value);
  81. /*ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause*/
  82. 目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。
  83. ------------------删除特定重复行--------------
  84. --主要通过order by +limit 或者直接limit
  85. create table test_3(id int,value int);
  86. insert test_3 select 1,2 union all select 1,3 union all select 1,4 union all select 2,3;
  87. --这是要保留ID=1 value最小的那个记录,删除其他id为的记录
  88. delete from test_3 where id=1 order by value desc limit 2;
  89. select * from test_3;
  90. +------+-------+
  91. | id  | value |
  92. +------+-------+
  93. |  1 |   2 |
  94. |  2 |   3 |
  95. +------+-------+
  96. 如果你只想删除任意的记录 保留一条 就可以去掉order by
复制代码

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作