欢迎投稿

今日深度:

重复记录(duplicate records)数据的相关操作,du

重复记录(duplicate records)数据的相关操作,duplicaterecords


MySQL 中查找重复数据,删除重复数据

  • 创建表和测试数据

/* 表结构 */
DROPTABLEIFEXISTS `t1`;
CREATETABLEIFNOTEXISTS `t1`(
`id`
INT(1)NOTNULL AUTO_INCREMENT,
`name`
VARCHAR(20)NOTNULL,
`
add`VARCHAR(20)NOTNULL,
PRIMARYKEY(`id`)
)Engine
=InnoDB;

/* 插入测试数据 */
INSERTINTO `t1`(`name`,`add`)VALUES
(
'abc',"123"),
(
'abc',"123"),
(
'abc',"321"),
(
'abc',"123"),
(
'xzy',"123"),
(
'xzy',"456"),
(
'xzy',"456"),
(
'xzy',"456"),
(
'xzy',"789"),
(
'xzy',"987"),
(
'xzy',"789"),
(
'ijk',"147"),
(
'ijk',"147"),
(
'ijk',"852"),
(
'opq',"852"),
(
'opq',"963"),
(
'opq',"741"),
(
'tpk',"741"),
(
'tpk',"963"),
(
'tpk',"963"),
(
'wer',"546"),
(
'wer',"546"),
(
'once',"546");

运行完上面的SQL,可以用 SELECT*FROM `t1` 测试一下。

  • 查找所有重复的数据

重复数据只显示其中一条:

/* 查找所有重复数据,重复数据只显示一次 */
SELECT 
    * 
FROM
    `t1` 
GROUP BY `name` 
HAVING COUNT(1) > 1 
#HAVING COUNT(1) = 1 #这条语句表示显示其中不重复的数据

效果如下:     id  name    add     
------  ------  --------
     1  abc     123     
    12  ijk     147     
    15  opq     852     
    18  tpk     741     
    21  wer     546     
     5  xzy     123     


重复数据每条都显示

/* 查找所有重复数据(重复数据重复显示 */
SELECT 
    t1.* 
FROM
    t1,
    (SELECT 
        t1.name,
        t1.add 
    FROM
        t1 
    GROUP BY `name`,
        `add` 
    HAVING COUNT(1) > 1) AS `t2` 
WHERE `t1`.`name` = `t2`.`name` 
    AND `t1`.`add` = `t2`.`add` 


查询结果如下:

    id  name    add     
------  ------  --------
     1  abc     123     
     2  abc     123     
     4  abc     123     
     6  xzy     456     
     7  xzy     456     
     8  xzy     456     
     9  xzy     789     
    11  xzy     789     
    12  ijk     147     
    13  ijk     147     
    19  tpk     963     
    20  tpk     963     
    21  wer     546     
    22  wer     546     

  • 显示所有数据(重复数据只显示一次)

下面的SQL简单快速有效,但不能保证重复字段的records显示哪一个record。

SELECT 

    * 

FROM

    t1 

GROUP BY NAME 

#having count(*) > 1 #加上这条语句,重复字段的records只显示一次


  • 删除重复数据:

1 最简单快速 的方法:

1. 新建一个一样表结构的表,经重复内容字段设置为unique

2. 然后执行语句:INSERT IGNORE INTO new_table SELECT * FROM old_table

对于本题就是:

1. 新建t1_copy,然后将name,add设置为主键

2.执行INSERT IGNORE INTO t1_copy SELECT * FROM t1 ORDER BY t1.`id`, OK


2 笨方法UNION(数据量大时很慢):

SELECT 
    * 
FROM
    t1 
GROUP BY `name`,
    `add` 
HAVING COUNT(1) > 1 
UNION
SELECT 
    * 
FROM
    t1 
GROUP BY `name`,
    `add` 
HAVING COUNT(1) = 1 
ORDER BY id 



注意:

这里表中有一个主键id,若没有主键id,数据量大时会很慢,这样可以人为插入一个主键id。如

参考文章: http://www.cnblogs.com/consatan/archive/2010/12/17/1909087.html

转载请注明出处:http://blog.csdn.net/acema/article/details/37692867


sql中怎删除两条重复记录并保留一条

1、建一个临时表,其结构与主表一致,并且建立一个唯一索引
create unique index(column1,column2...) on tmp_table with ignore_dup_key on 'default'

2、从重复数据表中将所有数据导入到新建的临时表中
insert into tmp_table from your_duplicate_table

3、检查临时表中的数据是否都已唯一

4、删除原始重复数据表(这一步要注意是否有外键约束,如果有,也可以不删除而是将表里的数据清空后,再插回)

5、将临时表重命名为重复表的名子
 

sql语句插入时提示:“Duplicate entry 'XXX' for key 1 ” 是什原因?

你用的是MYSQL 数据库吧?

1:提示信息翻译:插入 xxx 使索引1重复
分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性。否则就会产生这个错误。
一般发生在对数据库写操作的时候,例如Discuz!4.1论坛程序要求所有会员的用户名username必须唯一,即username 的索引是unique,这时如果强行往cdb_members表里插入一个已有的username的记录就会发上这个错误,或者将一条记录的username更新为已有的一个username。
改变表结构的时候也有可能导致这个错误。例如 Discuz!4.0论坛的数据库中cdb_members.username 的索引类型是 index 这个时候是允许有相同username的记录存在的,在升级到4.1的时候,因为要将username的索引由原来的index变为unique。如果这时cdb_members里存在有相同的username的记录,那么就会引发这个错误。
导出数据据时有时会因为一些原因(作者目前还不清楚)导致同一条记录被重复导出,那么这个备份数据在导入的时候出现这个错误是在所难免的了。
修改了auto_increment的值,致使“下一个 Autoindex”为一条已经存在的记录

2:可能是你的数据表中像 ID 这样的自增字段AUTO_INCREMENT出现了问题,使用AUTO_INCREMENT时,应注意以下几点:
AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。
设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍。
AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。
AUTO_INCREMENT数据列必须具备NOT NULL属性。
AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。
3:根据以上信息你没有解决的话,请继续操作:
有可能是因为数据表文件损害导致,可用MySQL的修复工具myisamchk 工具修复。
在CMD下面输入:
myisamchk cdb_posts.myi -r
修复数据表就OK了!
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2072.html NewsArticle 重复记录(duplicate records)数据的相关操作,duplicaterecords MySQL 中查找重复数据,删除重复数据 创建表和测试数据 /* 表结构 */ DROP TABLE IF EXISTS `t1`; CREATE TABLE IF NOT EXISTS `t1`( `id` INT ( 1 )...
评论暂时关闭