回答

收藏

删除除MySQL中的一个以外的所有重复行?

技术问答 技术问答 92 人阅读 | 0 人回复 | 2023-09-13

如何从MySQL表中删除所有重复数据?
# v3 a3 g' v3 k* n$ k4 \0 F/ W例如,具有以下数据:1 U& P6 s. |, h
SELECT * FROM names;
5 F+ o2 ]1 n/ A% j+----+--------+
- @2 u9 X# v+ Y( i/ M| id | name   |
/ |) ~* J' o) U# m  n) V* A+----+--------+
* ^/ J2 p4 Y" e9 h( B, b: Z0 H| 1  | google |
! l" p0 L6 @; f$ Z| 2  | yahoo  |
* C" U" O0 k. ?6 A, j9 n7 S| 3  | msn    |! f3 X- K0 D$ \  x5 O- Y9 _5 o
| 4  | google |/ w3 o  r, K/ ~  q3 U
| 5  | google |
6 t3 `1 Y' w: S: H& F- h! u+ H| 6  | yahoo  |
7 ]/ @. f8 u- J- _' T7 T6 W+----+--------+
9 w8 l/ L) S' h/ ]. ]; u* d我会使用,SELECT DISTINCT name FROM names;如果它是一个SELECT查询。0 Y: l% H  t4 W$ j
我该怎么做DELETE才能只删除重复项并仅保留每个记录一个?$ a$ g+ g% w* ^9 Y9 l
                4 A/ x5 T1 ?, A5 }& Q
解决方案:8 |$ H6 m( ]. V1 T3 V# ?3 Z3 p
                & A6 m! i: ]6 q* b6 M$ r

1 x& U. ?+ M# F6 S5 v4 r1 t* z3 u* U, j9 t
                , b5 a4 \# [! Z& x7 f9 V* _
编辑者警告:此解决方案的计算效率低下,可能会降低大型表的连接。" `, ?) H* f- h# r
& \+ |7 c9 ^, P% u
注意:您 需要 首先在表的 测试副本 上执行此操作!
# C* N. p; r1 p8 G2 E6 U1 E完成此操作后,我发现,除非也包含AND n1.id  n2.id,否则它将删除表中的每一行。
. Y& j. q/ K3 |5 l[ol]. ]7 U1 M5 `# Q3 _1 ^+ u& [+ m
如果要使行的id值保持最低,请执行以下操作:
$ [4 Y3 R) i8 ~) F4 kDELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name& M( y4 v$ B- ]1 f& o- x+ k

$ p* |* i3 x0 C0 {, [如果要保留最高id值的行:
0 t5 }+ L5 P- v6 pDELETE n1 FROM names n1, names n2 WHERE n1.id
0 L) X$ b/ f( O# t+ V[/ol]
# Y5 `$ P- s2 M) T& g' F我在MySQL 5.1中使用了这种方法
% F9 u5 `$ V! }8 H' q% n不确定其他版本。6 g; O7 c' `* W  W! N( ^) f; K% f1 ~

% s4 i; _, S4 W8 |2 u更新:由于使用Google搜索来删除重复项的人员最终会出现在此处
! u: s/ `* R, s" e2 ]: F尽管OP的问题是关于DELETE,但请注意使用INSERT和DISTINCT会更快。对于具有800万行的数据库,以下查询花费了13分钟,而使用DELETE,则花费了2个多小时,但尚未完成。
& f* w9 A6 i1 J" jINSERT INTO tempTableName(cellId,attributeId,entityRowId,value)$ ^+ F( r" v; Z
    SELECT DISTINCT cellId,attributeId,entityRowId,value
8 g* n+ K7 ~3 v2 j% G! B' {' D    FROM tableName;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则