找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 1888|回复: 0
打印 上一主题 下一主题

mysql删除重复记录,保存Id最小的一条

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:$ e! F$ ?2 ]* ?7 v7 A
1、创建一个临时表,选取需要的数据。
: M1 j1 w! H! L1 v2、清空原表。6 Z* s: S) A/ J
3、临时表数据导入到原表。
9 z* M0 R( B9 a5 T- h4、删除临时表。
: o4 n$ L  r) L  J, t# c9 jmysql> select * from student;
" B; d2 }3 M8 w* h' P" ~' ^1 g+----+------+. e9 Z; @% O8 d8 j! o
| ID | NAME |
9 s' w# S; C% H& r" s+----+------+, t  u$ D: y- L& }
| 11 | aa |  i- K, ~  H2 n+ c4 ^3 L8 K
| 12 | aa |
9 e& }+ ]- f$ u: S| 13 | bb |
/ x1 M" _% ]1 H| 14 | bb |. `3 c" \/ I5 s# o
| 15 | bb |. P2 K1 L; u3 G. p7 u2 w# P5 ~
| 16 | cc |
1 k% x  y% A/ g8 C5 t% A& s+ S# s, d+----+------+, g' {9 l- O8 A, w8 ^
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;: r% M+ T) d3 X. b! `/ h+ X# x- P) K4 i
Query OK, 3 rows affected  q  q" O/ H, z
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;; L- U4 [$ X% H, r0 U
Query OK, 0 rows affected
mysql> insert into student select * from temp;
  O% J0 n. U5 }- MQuery OK, 3 rows affected
/ T# L% q2 w" _6 Q( nRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;; C* X1 U3 L! A9 ]; Y, X* q0 u
+----+------+* `# J  N" T, F: [1 e  y
| ID | NAME |( `( v7 w1 K: {) i
+----+------+
" N1 l) R8 x6 ~2 Q| 11 | aa |
" R5 |( n4 J4 {, \2 M% z| 13 | bb |8 Y+ Y2 U% j9 m* D( x
| 16 | cc |
4 `) r5 K" M# k0 t* L+----+------+- r' R4 G/ k: p* E+ G
3 rows in set
mysql> drop temporary table temp;+ l7 l( b: ^  n0 z* D
Query OK, 0 rows affected6 F& w$ c3 a& H
这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:1 S& g& q; i5 U
mysql> create temporary table temp as select min(id) as MINID from student group by name;; V+ }9 i0 [0 x
Query OK, 3 rows affected
7 q: W$ G+ a& c& X% G+ p3 C0 GRecords: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);
$ r5 }) B- @8 E% h0 V' L$ _Query OK, 3 rows affected
mysql> select * from student;
3 Z* C  X; H$ y+----+------+
: N3 ?1 X3 Z" I/ e; G| ID | NAME |
: A" {& j) Z: o. x0 d  C' h+----+------+
* R" @  T' W* y5 T| 11 | aa |
. G1 M6 y: A! T5 g6 s8 o| 13 | bb |
. @+ G- f- M! s6 y6 \| 16 | cc |- ~" d; {4 J* c+ g% F
+----+------+# J0 Q4 \; b' ?" N/ _
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);
( ~6 L* e* Q# J* h执行报错:1093 - You can't specify target table 'student' for update in FROM clause+ a4 g7 C: T+ U( ^) v1 x9 x
原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。
: `; j7 b2 L' T* B. t; O怎么规避这个问题?
2 N; p) i& e5 l! E; F$ c再加一层封装,如下:
9 A1 ~6 m; B1 p. ymysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);" b8 }% m  F( T: Q* ]5 F" f
Query OK, 3 rows affected
mysql> select * from student;% l, F8 ]# b' N/ f
+----+------+# ]  U) V6 [) O; C+ G
| ID | NAME |
8 y; r6 z6 E# r9 b3 m) V+----+------+
7 i4 E) u  B3 o6 i9 q) ]| 11 | aa |
5 y  B+ V5 G3 T/ ]! G  u' p1 M# j2 {| 13 | bb |. y, ~& m/ _' m9 ~: ~+ ]$ r: a
| 16 | cc |. {, t; k" J' V% R, q0 {
+----+------+
7 S! H  ^1 w# ?3 rows in set
; }  O! X% ?$ E8 [; P
方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);6 j) ]6 n1 U1 x( [+ h  T; n: ]

1 J; U- B" ~0 k+ Y/ m5 Q8 e7 L* e- n( g4 E
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表