Navicat使用教程:如何在MySQL中定位和删除有重复意义的值

翻译|使用教程|编辑:黄竹雯|2019-01-29 09:48:47.000|阅读 95 次

概述:本篇文章介绍了如何识别MySQL中的重复数据,以及如何删除它们而不删除宝贵的有效数据。

相关链接:

下载Navicat Premium最新版本

Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。

DBA最大的麻烦之一是处理重复数据。不管我们如何防范,重复数据总是会设法进入到表格。重复数据是一个大问题,因为它会影响应用程序视图(每个项都应该是唯一的)、扭曲统计信息,在严重情况下还会增加服务器开销。

在本技巧中,我们将学习如何识别MySQL中的重复数据,以及如何删除它们而不删除宝贵的有效数据。

Navicat

重复类型

您将遇到的大多数重复记录是两种不同类型之一:重复含义和非唯一键。在本篇文章中,我们将处理重复含义;在下篇文章中,我们将处理非唯一键。

当副本不是副本时

重复意义是最常见的重复类型。在这种情况下,两个或多个字段的内容不相同,但它们的含义是相同的。你可以把它看作是语义上的重复数据。

考虑下表摘录:

movie_name	media
---------------------------
ACADEMY DINOSAUR	Theatre
ACE GOLDFINGER	Television
ADAPTATION HOLES	Theatre
AFFAIR PREJUDICE	Theatre
AFRICAN EGG	TV

在媒体专栏中,“Television”和“TV”两个词条的含义相同,但表达方式不同。这个问题通常是由使用自由文本输入引起的,有限的下拉列表是更好的选择。

这种类型的复制处理起来非常困难,因为不能使用select distinct排除重复项。

有两种方法可以解决这个问题:

1.使用replace()选择数据,将不需要的值替换为希望看到的值:

SELECT DISTINCT	movie_name,
REPLACE(media, "TV", "TELEVISION") as media,
FROM films;

2.更新实际表数据。下面是一个声明,用首选的“TELEVISION”值更新“TV”的所有实例:

UPDATE films
SET media = REPLACE(media, "TV", "TELEVISION")
WHERE media = "TV";

下面是一个真实的例子!

一些不需要的卷曲撇号进入了数据。注意“O'BRIEN”和“O'BRIEN”条目:

first_name	last_name
---------------------
PENELOPE	GUINESS
CONAN	O'BRIEN
ED	CHASE
JENNIFER	DAVIS
CONAN	O'BRIEN

我们可以像上面那样处理这个问题:

1.使用replace()选择数据,用常规的单引号替换大撇号,这样我们就可以始终处理相同的字符:

SELECT DISTINCT	first_name,
REPLACE(last_name, "'", "'") as last_name,
FROM actors	
WHERE REPLACE(last_name, "'", "'") like "O'BRIEN";

2.更新实际表数据。此语句用常规单引号更新姓氏列中的所有撇号:

UPDATE actors
SET last_name = REPLACE(last_name, "'", "'")
WHERE last_name like "%'%";

结论

重复记录、双精度、冗余数据、重复行;无论您如何称呼它们,它们都是DBA生命中最大的缺陷之一。然而,重要的是要定期清除它们,以免产生错误的统计数据并混淆与数据库交互的用户。

购买Navicat Premium正版授权,请点击“咨询在线客服”哟!

PyCharm



标签:数据库mysqloracle

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果

登录慧都网发表评论登录


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关厂商
相关产品
Navicat Premium

Navicat Premium 是一套数据库管理工具,让你使用一个程序即可同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。

在线客服 在线QQ 电话咨询
400-700-1020
反馈
在线客服系统
live chat