中国网络渗透测试联盟
标题: mysql删除重复记录,保存Id最小的一条 [打印本页]
作者: admin 时间: 2016-8-23 20:58
标题: mysql删除重复记录,保存Id最小的一条
方法1:8 G& z" E- D, k0 R" j8 h/ G
1、创建一个临时表,选取需要的数据。
% C- V6 q$ X: X; f2、清空原表。" e9 d; K, l9 Z6 m( w4 |
3、临时表数据导入到原表。. L/ J+ e# Q) h- F) K8 |5 Y, R& ]2 R
4、删除临时表。6 ^$ |9 E% R4 d' f3 B9 B
mysql> select * from student;
: J5 K! L. G# @8 E. ]6 }% V: q" }+----+------+
; ]0 c6 H1 F+ H, a| ID | NAME |
( L% Q: z- B+ Y' N" `( Q+ p* u+----+------+( r. m$ } W% o' ]% L
| 11 | aa |
+ _4 Q. H+ X/ \( t4 U; D' b+ p| 12 | aa |$ q" H7 W1 @+ w8 G0 C
| 13 | bb |
/ x& f! e$ y. {| 14 | bb |
5 k1 F& V: q) C( e1 l4 X| 15 | bb |. T! j+ }2 a& p! ~2 a# X& S
| 16 | cc |# q' j8 n/ _ @+ ^( C, v- ` c8 q
+----+------+
8 F- e) N( U2 e6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
9 z' N$ A! E: D ^Query OK, 3 rows affected
, J# X; q7 K$ f1 s( ~" NRecords: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;( d# [7 `* H, R4 Q
Query OK, 0 rows affected
mysql> insert into student select * from temp;
" ^, z5 n$ X2 G7 ?* l3 e* Y. kQuery OK, 3 rows affected; c+ s7 `9 Y0 d& d
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
) a2 u* h+ x$ |, ^; N9 h# i+----+------+* }/ U/ W" Z* B( t. o0 X9 W
| ID | NAME |
, G9 i4 ` R/ ~3 y; a4 _1 L) A( m+----+------+" a) f! d8 z4 V' q+ u# k! j7 q
| 11 | aa |
- N9 I K( x* y. @! P5 Y8 ?| 13 | bb |, {- _" t) d6 @- C- g
| 16 | cc | k) ~. H$ F, |: @' A0 H
+----+------+) ?2 [& t$ K9 E5 d: k
3 rows in set
mysql> drop temporary table temp;
. Y' w+ b% o; {Query OK, 0 rows affected
& P/ a$ Q) _4 p* ^' i这个方法,显然存在效率问题。
方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
, q6 I; m3 m0 }7 A8 _! tmysql> create temporary table temp as select min(id) as MINID from student group by name;) \) W2 w- U8 g0 M$ x
Query OK, 3 rows affected7 g; q5 B( E, I- R% b4 A- ]
Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);, s% Y7 f# r/ ]# b$ m7 g- Y8 i/ c) F
Query OK, 3 rows affected
mysql> select * from student;5 p* x3 G+ T! M( ]
+----+------+' |8 d8 A" r; [9 T: S4 N+ ~
| ID | NAME |
1 Y* Z5 g x+ o' I+----+------+
' ^0 ]' ^) ~5 u| 11 | aa |* J; u# |4 p: z5 f# t; L
| 13 | bb |
$ @4 G1 O5 N. j4 _# m0 }| 16 | cc |
$ G. u6 j5 Q L" J3 s. T# F g+----+------+
" e1 Y8 W! ^" w/ E4 l9 N3 rows in set
方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
9 k; d) y( s5 h4 j执行报错:1093 - You can't specify target table 'student' for update in FROM clause$ r& R: O9 I. D, }* M
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
, V; m$ k. K* ]' J1 ]' Z" F, v w: U怎么规避这个问题?
& G7 P2 f: m7 Z: F再加一层封装,如下:* G. Q$ V6 U4 o8 j! S6 z8 ?) D
mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);$ n% }- n* z$ ~: j
Query OK, 3 rows affected
mysql> select * from student;
4 C, F3 ?) s: m" L7 q) w+----+------+" Q& C4 g* ~/ j0 j+ Q8 e
| ID | NAME |
0 W. J- u j8 |1 z. g+----+------+
) n& U3 i: [ Q| 11 | aa |% l8 Q+ f9 ]* Q5 g' k4 k
| 13 | bb |
6 V( ^, f$ v- Z, e| 16 | cc |; N7 T0 ]2 O% W% M4 B; B
+----+------+7 f9 r$ H; M. ?7 G7 H
3 rows in set
; X& e2 ]% ~1 \3 L! y& `$ J! z
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);
1 t% f4 e6 ]: ^' D% j% K7 ]5 q+ h+ ^7 k
' G7 r% Q- U# r& ^! x) c
| 欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) |
Powered by Discuz! X3.2 |