回答

收藏

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

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

如何从MySQL表中删除所有重复数据?* Q6 {) y# F( Z0 y( \
例如,具有以下数据:
; y0 B% h6 z! B& oSELECT * FROM names;- Q; e# a$ |4 I4 h3 V
+----+--------+6 W0 f# m  \0 ]7 X9 p3 t2 O
| id | name   |+ V# h8 k7 _1 ^" v
+----+--------+* l5 G$ D2 A1 [- i; T) l6 K
| 1  | google |
( ]6 w( Y7 R  O; E| 2  | yahoo  |
9 n# {( L, s. o; G* w( F# M$ _1 _| 3  | msn    |5 S% e& \! f# Y, S
| 4  | google |$ H# S5 @0 I  o4 L* ^
| 5  | google |& x1 R9 v; K  \( U$ E
| 6  | yahoo  |; S: V. N& ~+ v5 H" C# ]
+----+--------+
8 t: ]6 n' E' ^$ W. ]2 G我会使用,SELECT DISTINCT name FROM names;如果它是一个SELECT查询。
7 ^6 j! j, f5 Z: w  F9 T5 y2 U- y我该怎么做DELETE才能只删除重复项并仅保留每个记录一个?
+ j: Q& b' d0 n                / G. n$ v7 o) p$ T* {% ]
解决方案:3 r4 s: Y; [, s# A: V# y
               
5 M5 n' h; I4 }+ f5 n4 O: ^; Q( s- |2 N. i  I

+ U) s& ?4 d. L3 o8 ?' z3 L1 P                0 N% }5 f, r) }: P
编辑者警告:此解决方案的计算效率低下,可能会降低大型表的连接。7 x8 {, k: s4 h6 e" U4 E* ?. K  X
2 r2 U6 N) B! @) N/ t+ s
注意:您 需要 首先在表的 测试副本 上执行此操作!! H7 y1 d5 Y# ^! |7 h% [
完成此操作后,我发现,除非也包含AND n1.id  n2.id,否则它将删除表中的每一行。! U3 b: \$ I. s8 W$ ?) Q; ^
[ol]* f- {! j' s: r: H+ X/ F
如果要使行的id值保持最低,请执行以下操作:
% K2 J% L3 w( U& x/ q0 RDELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
, c1 d3 g1 z; L/ M& M/ t! P5 c) c$ S- P# @
如果要保留最高id值的行:
' |' d& |' X4 u9 d. dDELETE n1 FROM names n1, names n2 WHERE n1.id $ L- F4 n3 T" A3 a$ d! ?
[/ol]
/ F) A1 n7 U9 @8 @我在MySQL 5.1中使用了这种方法
' [8 Z8 P; I  f+ O# U4 N6 K不确定其他版本。4 h) `8 J( C0 \
+ R' d8 s  V% U  U  \  F. Q3 F
更新:由于使用Google搜索来删除重复项的人员最终会出现在此处
( h& V* _, [! j2 Z  f" J尽管OP的问题是关于DELETE,但请注意使用INSERT和DISTINCT会更快。对于具有800万行的数据库,以下查询花费了13分钟,而使用DELETE,则花费了2个多小时,但尚未完成。" _+ n% [0 n  G9 p6 J7 V' A
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)7 t, X8 D. o9 B7 D/ G; G* n
    SELECT DISTINCT cellId,attributeId,entityRowId,value
: ^5 s0 {$ ~, [    FROM tableName;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则