找回密码
 立即注册
查看: 2852|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2016-8-23 20:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法1:4 d- V- q5 a2 _- ]+ u9 ?/ `9 G; c
1、创建一个临时表,选取需要的数据。
2 y% X$ \8 K& q7 p! Z2、清空原表。
& _; Z7 j/ _- ^9 }* U3、临时表数据导入到原表。
* j4 i- f6 _( _; s, ?. D4、删除临时表。, b$ r6 `$ q0 d" F% q' ^
mysql> select * from student;
8 ?2 p" D& U5 `+----+------+: r$ p* K# O/ C! z# P( ~, b3 n
| ID | NAME |8 C' O: v* |& D% d0 D1 L: C
+----+------+
3 \) q9 N3 [# M! R9 k| 11 | aa |
- A3 j0 M3 E+ V( \| 12 | aa |
" U0 h- T, z2 ^5 S: \  H: i) ?| 13 | bb |
) d' e5 x  R3 }+ e3 L& `) ^/ n| 14 | bb |3 ]/ m  a, @( _5 F/ D6 s
| 15 | bb |' P4 n8 v9 c: J, Y/ |
| 16 | cc |
. x) G, i$ ^% A+ }+----+------+- V6 S% D/ _% C$ i+ E
6 rows in set
mysql> create temporary table temp as select min(id),name from student group by name;
' N# }( u' y  ]0 g+ ]Query OK, 3 rows affected: U. L/ X8 n$ ?( b4 g" I
Records: 3 Duplicates: 0 Warnings: 0
mysql> truncate table student;; e4 J0 E# C! X( x- Q7 E: {
Query OK, 0 rows affected
mysql> insert into student select * from temp;  [+ C/ q# m# w  o. b8 O2 g
Query OK, 3 rows affected
, B2 t) z" }' X: u5 aRecords: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
  ?# E' S9 [0 {+----+------+0 [( v5 n( c* ^- g
| ID | NAME |
, A2 m2 E% h4 h$ j3 w+----+------+
7 R4 g  L; ~' t5 g% [| 11 | aa |, k  I. G* i( f
| 13 | bb |6 [, }+ a1 Q9 p
| 16 | cc |
0 Y) F7 H3 t+ J9 f1 H+----+------+- t6 H1 T7 J0 W; m
3 rows in set
mysql> drop temporary table temp;/ x: w# d. G$ U5 L5 K* k0 a" \
Query OK, 0 rows affected
* O+ c' l& y. ^这个方法,显然存在效率问题。

方法2:按name分组,把最小的id保存到临时表,删除id不在最小id集合的记录,如下:
4 f9 \6 {& v. l# Emysql> create temporary table temp as select min(id) as MINID from student group by name;/ j$ @1 Y& P, }/ z4 P
Query OK, 3 rows affected
2 |, D3 _0 O- y  [2 f+ ~Records: 3 Duplicates: 0 Warnings: 0
mysql> delete from student where id not in (select minid from temp);3 h0 M+ ?& q) Y# Z$ l6 Q( P" l
Query OK, 3 rows affected
mysql> select * from student;
% u: V" y+ [, g+----+------+
' B+ Q7 U- ]- H. || ID | NAME |, S* H' N. h8 s
+----+------+0 U: c$ }  U' u; L
| 11 | aa |
' L; u! r8 ]& g4 \% t( A+ F| 13 | bb |
6 X  L; |: V* Q, u) @3 j9 }| 16 | cc |, y: ^2 N6 E& ~9 V  o' m1 Z
+----+------+# p6 o  b2 W: q9 L
3 rows in set

方法3:直接在原表上操作,容易想到的sql语句如下:
mysql> delete from student where id not in (select min(id) from student group by name);0 P. c+ x" C, T) Z  k
执行报错:1093 - You can't specify target table 'student' for update in FROM clause
. n" D, o5 R+ ?/ h" r! I3 p) i原因是:更新数据时使用了查询,而查询的数据又做了更新的条件,mysql不支持这种方式。! }& P+ f1 U: ^
怎么规避这个问题?; U, _2 O' X# v+ i
再加一层封装,如下:
" ^# }# O1 u( Kmysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);) E# E4 V0 L1 ^( }+ s4 l
Query OK, 3 rows affected
mysql> select * from student;1 k! ?8 V7 D0 ]" x
+----+------+
8 d- c5 j% J/ z- e) q' p| ID | NAME |
! `9 M1 j. P' P! Y+----+------+$ |4 p+ H% r9 R( z8 C, d
| 11 | aa |
* g0 ]- j9 x4 `6 s| 13 | bb |
% A3 b: b, P# S4 i| 16 | cc |* y) B# c! u8 B& v
+----+------+" I6 N; i' S3 H, s* m: O
3 rows in set

7 z0 }% }% C$ M. T, ~; V方法三例如:delete from bugdata where id not in (select minid from (select min(id) as minid from bugdata group by qxbh) b);# |$ A* j) `- D$ ~3 J0 v7 D
! Z4 J# R) N" h9 p: M2 T
8 G4 v3 A/ w: [/ ^' z. Q
回复

使用道具 举报

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

本版积分规则

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