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 |