MySQL如何消除重复行
短信预约 -IT技能 免费直播动态提醒
这篇文章给大家分享的是有关MySQL如何消除重复行的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
sql语句
----------------全部字段重复------------------------
--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.value<value);
目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。
------------------删除特定重复行--------------
--主要通过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如何消除重复行”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341