`
1enny
  • 浏览: 70180 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

处理重复项

 
阅读更多
mysql cookbook00014

处理重复项
14.0 引言
处理重复行的操作包括一下几种:
    1. 在一开始就进制在数据表中产生重复项。
    2. 对重复项技术以确定他们是否存在以及严重到什么程度
    3. 通过鉴别重复值来发现哪些是重复项以及他们是在什么时候出现的
    4. 消除重复项以确保每行都是唯一的
有几种方式可以帮你处理重复行,你可以根据你要实现的目标来选择他们:
    1. 创建包含主键或者唯一索引
    2. 与唯一索引相结合,INSERT IGONE和REPLACE语句使你能够从容的处理重复行插入而不报错,对于统一载入操作LOAD DATA 语句中也适用
    3. 如果你需要确定表中是否含有重复行,使用GROUP BY分类计算
    4. SELECT DISTINCT 用于在结果集中删除重复行,对于已经存在重复行的表,可以通过增加唯一索引来删除他们。如果表中含有N个同样的行,你可以使用DELETE..LIMIT从这个特殊的行集合中删除n-1条记录
14.1 防止在表中发生重复
建立索引:primary key/ unique(它是允许NULL值的,则NULL值具有特殊性是因为他可以出现多次,
这样做的理由是因为确定一个未知值是否与另一个未知值相等是不可能的,所以未知值是存在的)
14.2 处理向表中装载行是出现的重复错误
问题:对于已经建立起来了唯一索引的表,怎样向其中的表中插入数据
解决:简单的方法忽略这些错误,另一种方式是通过使用:INSERT IGONRE、REPLACE或INSERT ..ON DUPLICATE KEY UPDATE语句,
这些语句修改了MYSQL的重复处理机制对于桶载入操作,再入数据的修饰语使你能够指定如何处理重复
对于已经建立的唯一或主键约束的表来说插入重复的行会报错,对于下面的几种方式来解决上面的问题:
    1. 先使用SELECT 以检查该行是否已经存在,再向其中行插入记录(这种操作是错误的,因为在你插入之前,查询之后另一个客户端操作了表)
    2. 如果当重复发生是你希望保持原有的行,那么就应该使用INSERT IGNORE来取代INSERT;当重复发生时,IGNORE关键字告诉MYSQL悄悄的丢弃被插入的记录,而保持原有记录。:1代表插入;0代表重复,丢弃。
    3. 如果当重复发生时,你希望被插入的行被覆盖;此时应该是使用REPLACE取代IGNORE关键字了:1代表插入;2代表替换行。
    4. 如果重复发生时,你希望修改已存在的相关列;此时应该是使用INSERT ...ON DUPLICATE KEY UPDATE语句。通过受影响行的计数值了解具体情况:1代表插入;2代表更新。
    5. 总结:INSERT IGNORE比REPLACE效率更高,因为他并不实际的插入重复行。因此,假如你只需要证实表中是否存在一个给定行的拷贝时,最好是使用前者,另一方面,REPLACE更适合用于表中其他非键列需要被替换的情况。而结果你需要对于表中未出现的int记录能够正常插入,而在索引列发生重复时更行其中的某些列的话,INSERT...ON DUPLICATE KEY UPDATE更为合适
问题1:如何为新用户添加记录,为旧用户修改密码?
解决:REPLACE INTO user(username,password) VALUE('name','pwd');
问题2:如何做好选票记录的工作?
解决:INSERT INTOvote(username,count) VALUE('name',1)ON DUPLICATE KEYUPDATE count = count +1;


14.3 计数和识别重复项
使用计数摘要以查找并显示重复项。为了查看重复值的发生,将该摘要与原始表相关联
SELECT COUNT(*) ,col1,col2,...FROM tab1 GROUP BYcol1,col2,...HAVING COUNT(*) > 1//列集合相同
14.4 从表中消除重复项
通过选择表在中具有唯一性的行,并放入到第二张表中,你可以用它替换原表,或者使用alter子句增加唯一索引,甚至通过DELETE ...LIMIT N
来删除给定重复行多余的记录行。
mysql> select * from catalog_list;
+------------+-----------+---------+
| first_name | last_name | address |
+------------+-----------+---------+
| aaa | aaaa | aaaaa |
| aaa | bbbb | bbbbb |
| bbb | bbbb | bbbbb |
| bbb | ccc | ccccc |
| ccc | cccc | ccccc |
| ddd | dddd | ddddd |
| ddd | eeee | eeeee |
| eee | eeee | eeeee |
| aaa | aaaa | aaaaa |
| aaa | bbbb | bbbbb |
| bbb | bbbb | bbbbb |
+------------+-----------+---------+
11 rows in set (0.00 sec)
上面已经说了有三种方式来消除重复项:
    1. 使用表替换来删除重复相
      mysql> select * from catalog_list;
      +------------+-----------+---------+
      | first_name | last_name | address |
      +------------+-----------+---------+
      | aaa | aaaa | aaaaa |
      | aaa | bbbb | bbbbb |
      | bbb | bbbb | bbbbb |
      | bbb | ccc | ccccc |
      | ccc | cccc | ccccc |
      | ddd | dddd | ddddd |
      | ddd | eeee | eeeee |
      | eee | eeee | eeeee |
      | aaa | aaaa | aaaaa |
      | aaa | bbbb | bbbbb |
      | bbb | bbbb | bbbbb |
      +------------+-----------+---------+
      11 rows in set (0.00 sec)
      mysql> create table catalog_list_new like catalog_list;
      Query OK, 0 rows affected (0.16 sec)
      mysql> insert into catalog_list_new select distinct * from catalog_list;
      Query OK, 8 rows affected (0.08 sec)
      Records: 8 Duplicates: 0 Warnings: 0
      mysql>
      该方法可以使用在缺乏索引的情况下(尽管可能对于大型表来说速度比较慢)。对于包含重复NULL值的表,它将删除哪些重复的项,但是不能组织将来出现重复项
      该方法要求被人为是重复项的行必须是完全相同的,如果重复项被定义为只与表中列的子集相关,可以为那些列建立唯一性索引表,并且使用INSERT IGNORE将数据插入。
      mysql> create table catalog_list_new like catalog_list;
      Query OK, 0 rows affected (0.17 sec)

      mysql> alter table catalog_list_new add primary key(first_name,last_name);
      Query OK, 0 rows affected (0.28 sec)
      Records: 0 Duplicates: 0 Warnings: 0

      mysql> insert ignore into catalog_list_new select * from catalog_list;
      Query OK, 8 rows affected (0.11 sec)
      Records: 11 Duplicates: 3 Warnings: 0

      mysql> select * from catalog_list_new;
      +------------+-----------+---------+
      | first_name | last_name | address |
      +------------+-----------+---------+
      | aaa | aaaa | aaaaa |
      | aaa | bbbb | bbbbb |
      | bbb | bbbb | bbbbb |
      | bbb | ccc | ccccc |
      | ccc | cccc | ccccc |
      | ddd | dddd | ddddd |
      | ddd | eeee | eeeee |
      | eee | eeee | eeeee |
      +------------+-----------+---------+
      唯一索引阻止了在向表中插入行时出现的重复键值,IGONE提示MYSQL当重复发生时不要因为报错停止。这种方法的
      的缺点是如果索引列需要包含NULL值那么你必须使用UNIQUE索引而不是PRIMARY KEY。
2. 通过增加索引来删除重复项
为了适当的在表中删除重复项,需要使用ALTER TABLE 向表中增加唯一索引,并使用IGONE关键字来提示创建索引构建过程中
丢弃带有重复键值的航记录。
mysql>alter ignore table catalog_list_new add primary key(first_name,last_name);
ERROR 1062 (23000): Duplicate entry 'aaa-aaaa' for key 'PRIMARY'
mysql> show create table catalog_list_new;
+------------------+---------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------+
| Table | Create Table
|
+------------------+---------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------+
| catalog_list_new | CREATE TABLE `catalog_list_new` (
`first_name` varchar(30) NOT NULL DEFAULT '',
`last_name` varchar(30) NOT NULL DEFAULT '',
`address` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------------+---------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>alter table catalog_list_new engine =myisam;
Query OK, 11 rows affected (0.28 sec)
Records: 11 Duplicates: 0 Warnings: 0

mysql>alter ignore table catalog_list_new add primary key(first_name,last_name);
Query OK, 11 rows affected (0.16 sec)
Records: 11 Duplicates: 3 Warnings: 0
mysql>
注意:你会发现当表的引擎是INNODB的时候通过第二种方式来删除重复记录是不能成功的,只有通过修改表引擎为MYISAM才可以使用 方式2删除重复记录


3. 删除特定行的重复项
mysql> delete cln from catalog_list_new cln inner join temp on cln.first_name = temp.first_name
-> and cln.last_name = temp.last_name
-> where limit temp.count;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
ear 'limit temp.count' at line 3
//通过上面红色的标记可以看到在LIMIT中引用了行记录中的元数据这样会报语法错误,这是因为LIMIT是用来刷选查询出来的行记录,而在这个关键字中使用行中记录来确定全部记录信息这就矛盾了。顶多是自己确定自己而不能约束他人

可以自己写一个函数通过重复的条目数来删除记录
基本的删除重复语法是:DELETE FROM tab1 WHERE col1 = '区别记录值' LIMIT duplicatesCount - 1;


14.5 从自连接的结果中消除重复




















分享到:
评论

相关推荐

    php处理二维数组(去除重复项,排序,转换,去空白等)

    php处理二维数组(去除重复项,排序,转换,去空白等)

    WPS表格2021中对于重复项的处理.docx

    WPS表格2021中对于重复项的处理.docx

    无需数据“有效性” “重复项”处理更简单.docx

    无需数据“有效性” “重复项”处理更简单.docx

    python常用数据重复项处理方法

    还需要进行重复项的删除 在数据的收集过程中,可能会存在重复观测的出现,例如通过网络爬虫,就比较容易产生重复数据.如下表,是通过爬虫获得某APP市场中电商类APP的下载量数据(部分) 通过观测可以看出唯品会和当当出现...

    learn_ruby_oneliners:基于示例的命令行中使用ruby进行文本处理的指南

    Ruby一线食谱 基于示例的命令行中使用ruby进行文本处理的指南。 书中还包括演习,以测试你的理解,这是一起呈现在本回购单个文件- ...处理重复项 处理结构化数据 致谢 ruby-lang文档-手册和教程 /

    C语言习题sort.c

    通讯录整理:读取一组电话号码簿(由姓名和手机号码组成),将重复出现的项删除(姓名和电话号码都相同的项为重复项,只保留第一次出现的项),并对姓名相同手机号码不同的项进行如下整理:首次出现的项不作处理,第...

    fo:用于将某些文件移动到配置目录的简单命令行工具

    fo(文件优化器) ... 无法处理重复项的应用程序。 他们会留在那里。 当确信有效副本时,需要手动处理文件以将其删除。 目标 清理系统和目标重复文件。 执行应用程序后,重复的文件将不在正确的文件夹中。

    webArchiver:与Web服务器兼容的归档实用程序

    它通过处理重复项来节省空间,将所有文件保留在中央位置,并保留日志。 其他新功能(例如cgi Web界面,网站的自动存档和其他终端功能)即将问世! 在Alpha中,当您处理现有文件或文件夹时,您可能会看到python发出...

    material_calculator:Google最初的计算器,作为网络应用

    应该处理重复项。 应该处理重复的操作员输入 应该处理除以0。将结果设置为“不能除以0” 最多只能输入12位数字 单击=时,DEL应更改为CLR。 单击“ CLR”将同时清除表达式和结果屏幕 单击=时,结果应替换表达式区域...

    SpeedyDuplicateFinder1.4.1x64一款极快的扫描1000个文件不到1秒重复文件查找器.exe

    您不仅可以在文件夹中搜索重复项,还可以在整个磁盘上搜索! 直观 简单 就像 1 2 3 一样简单。适合所有年龄段和所有用户! 多个文件夹 您可以同时在多个文件夹中找到重复项! 智能过滤 器 按种类、扩展名或大小...

    重复项数据分析_ocr识别_OCR_OCR识别PDF_pdf文字识别_

    OCR文字识别,可已处理PDF文件批量识别文字

    Data-Analytics-Projects

    分析概要评估数据,并决定处理重复项和不匹配的值。 使用Python中的Pandas,Numpy和statsmodels模块对数据执行概率计算,假设检验和逻辑回归。 提出建议,并以统计推断为依据来确定网页版本和已记录的分析局限性

    重复文件查找工具 AllDup 4.4.46.zip

    功能强大的搜索引擎使您能够通过以下标准的组合来查找重复项:文件名,文件扩展名,文件大小,文件内容,文件日期,文件属性,硬链接和类似图片等。 重复文件查找工具 AllDup 中文多语特别版 重复文件查找工具 ...

    在ArcGIS中如何删除重复的点要素

    在ArcGIS中如何删除重复的点要素,第一种方法是借助ArcGIS...第三种方法是新近补上去的,主要思路和FME处理一样:先将点的坐标按 "x,y" 的格式写入一个字段,然后对这个字段进行重复项检查<两步都是使用field Calculate>

    idb.c:面向KISS的高效结构化列的KeyValue层次结构数据存储库C

    iDB C低层函数库KISS高效的面向... IDBDuplicationKeyProcess:列出子项时如何处理重复项dkIgnored:请勿将复制密钥添加到列表中。 dkFixed:删除左侧的复制密钥。 dkStopped:停止并引发错误。 dkReserved:也将复制

    MATLAB实现求Excel数据中重复项的最大值

    本程序可以高效的实现对excel数据中多个相同的x值对应的y值不同情况下求得所有x对应的y的最大值,并且不会重复显示,相比与用excel的矩阵运算处理时需要占用大量CPU资源和计算时间长久,本方法在面对大量数据情况下...

    pass-import:用于从大多数现有密码管理器导入数据的通行证扩展名

    Pass import处理重复项,并与兼容。 它以与兼容的方式导入OTP机密。 pass-import还提供了一个pimport脚本,该脚本允许将密码导入其他密码管理器。 例如,您可以将密码从Keepass数据库导入到通用CSV文件... 支持...

    leetcode分类-Leetcode:力码练习

    leetcode 分类Leetcode问题分类 根据使用的方法排序 大批 种类 整数排序 O(1) 空间使用:就地整数排序 ...#40:处理重复项 修剪以达到 O(n) 时间:#55 找到满足特定条件的最短组合:BFS(O(n) 空间使用) 通过存

    邮件地址处理工具

    您可以把如下的特殊字符:#,&,at,*,&,#,@,at,AT,*等方便地替换为@符号,可以快速删除重复项,快速地进行邮件地址集合的合并、分拆。让您处理起来省心省力。其中的逆向排序是一个很有用的功能,用它您可以...

Global site tag (gtag.js) - Google Analytics