Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。
大多数重复记录分为两类:重复意义和非唯一键。在Navicat使用教程:如何在MySQL中定位和删除有重复意义的值中,如何识别和删除具有重复意义的值涉及到重复意义;在Navicat使用教程:如何用非唯一键识别重复项中涉及到如何识别非唯一密钥。这意味着同一表中的两个记录具有相同的键,但可能具有或不具有不同的值和含义。这篇文章将介绍如何删除具有重复数据但具有不同键的行。
按类型标识重复项
在Navicat使用教程:如何用非唯一键识别重复项中显示的最后一个查询以易于直观扫描的格式列出了所有重复项:
1
2
3
4
5
|
Repetitions row_data
----------------------------------------------------------------
2 22 (DAVIS, JENNIFER) | 22 (DAVIS, JENNIFER)
2 23 (LOLLOBRIGIDA, JOHNNY) | 23 (GABLE, CHRISTIAN)
2 41 (WAHLBERG, NICK) | 12 (WAHLBERG, NICK)
|
在识别了所有重复的键和值之后,我们可以决定如何最好地处理冗余数据。
JENNIFER DAVIS以相同的22键出现在两个记录中,使这些行完全重复。Nick Walberg的名称字段是重复的,但ID不是。还有一个与两个无关的演员相关联的复制键:“JOHNNY LOLLOBRIGIDA”和“CHRISTIAN GABLE”的复制键#23。对于22和23的重复键,第一个键是真正的重复键,而第二个键只需要为其中一个记录生成一个新键。
使用删除联接删除行
在Navicat使用教程:如何在MySQL中定位和删除有重复意义的值中,我们通过对值执行搜索和替换,从选择的结果集中删除了重复的值。在这里,我们将使用DELETE JOIN语句永久删除其中一个重复的行。
因为我们正在比较同一个表中的字段,所以必须将该表与其自身联接。我们可以通过比较WHERE子句中的ID来选择保留较低或较高的ID号。以下语句保留最高的ID:
1
2
3
4
5
6
7
|
DELETE
a
FROM
wp.amalgamated_actors a
INNER
JOIN
wp.amalgamated_actors a2
WHERE
a.id < a2.id
AND
a.first_name = a2.first_name
AND
a.last_name = a2.last_name;
1 row(s) affected 0.093 sec
|
在本例中,受影响(已删除)行是标识为12的NICK WAHLBERG。快速选择确认结果:
1
2
3
4
5
6
7
8
9
10
11
12
|
id first_name last_name
-------------------------------------
10 PENELOPE GUINESS
12 NICK WAHLBERG
14 ED CHASE
22 JENNIFER DAVIS
23 JOHNNY LOLLOBRIGIDA
27 BETTE NICHOLSON
34 GRACE MOSTEL
39 JOE SWANK
23 CHRISTIAN GABLE
22 JENNIFER DAVIS
|
如果要保持最低的ID,只需将a.ida2.id。
1
2
3
4
5
6
7
8
9
10
11
12
|
id first_name last_name
-------------------------------------
10 PENELOPE GUINESS
14 ED CHASE
22 JENNIFER DAVIS
23 JOHNNY LOLLOBRIGIDA
27 BETTE NICHOLSON
34 GRACE MOSTEL
41 NICK WAHLBERG
39 JOE SWANK
23 CHRISTIAN GABLE
22 JENNIFER DAVIS
|
删除具有非唯一键的行
在JENNIFER DAVIS的例子中,他出现两次,同一个ID为22,我们需要使用不同的方法,因为使用a.id=a2.id运行上面的语句将针对表中的每一行!原因是我们基本上是在将每一行与自身进行匹配!在下一篇文章中,我们将学习如何删除具有非唯一键的行,如这些键。