Navicat使用教程:如何在MySQL中定位和删除有重复意义的值
Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。
DBA最大的麻烦之一是处理重复数据。不管我们如何防范,重复数据总是会设法进入到表格。重复数据是一个大问题,因为它会影响应用程序视图(每个项都应该是唯一的)、扭曲统计信息,在严重情况下还会增加服务器开销。
在本技巧中,我们将学习如何识别MySQL中的重复数据,以及如何删除它们而不删除宝贵的有效数据。
重复类型
您将遇到的大多数重复记录是两种不同类型之一:重复含义和非唯一键。在本篇文章中,我们将处理重复含义;在下篇文章中,我们将处理非唯一键。
当副本不是副本时
重复意义是最常见的重复类型。在这种情况下,两个或多个字段的内容不相同,但它们的含义是相同的。你可以把它看作是语义上的重复数据。
考虑下表摘录:
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正版授权,请点击“”哟!