sql语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
/*
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.value<value);
/*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
|