首页 电脑 电脑学堂 查看内容

怎样去除数据库中重复的数据,只保留一条?

2017-3-7 11:25 |来自: 互联网 4934 0

摘要: 我主要讲如何防止数据表出现重复数据及如何删除数据表中的重复数据。本文的测试都是居于MySQL数据库的,如果你使用的是Oracle或者SQL Server可以根据具体数据库简单修改sql语句。毕竟重要的是思想。(因全世界排名前 ...

我主要讲如何防止数据表出现重复数据及如何删除数据表中的重复数据。本文的测试都是居于MySQL数据库的,如果你使用的是Oracle或者SQL Server可以根据具体数据库简单修改sql语句。毕竟重要的是思想。(因全世界排名前三的是这三种数据库,其他数据库这里就不一一提及了)

  • 防止出现重复数据。

  • 删除已经存在的重复数据。

防止出现重复数据的方式:

  1. 设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。

    这种方式只需要你在不重复的列上加上 unique关键字就行了。

  2. 设置双主键模式来设置数据的唯一性,但是设置了双主键,那么那个键的默认值不能为NULL

值得注意的是,如果我们设置了唯一索引,那么在插入重复数据时,SQL语句将无法执行成功,并抛出错。

mysql提供另一种组织重复数据插入的方式:insert ignore

INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

统计重复数据和清除重复数据:

假如我们将统计表中 first_name 和 last_name的重复记录数:

  1. 使用分组查询的方式:

解释:

  • 确定哪一列包含的值可能会重复。

  • 在列选择列表使用COUNT(*)列出的那些列。

  • 在GROUP BY子句中列出的列。

  • HAVING子句设置重复数大于1

2.使用 DISTINCT 关键字来过滤重复数据

删除重复数据:

  1. 建立临时表,删除数据:

对于完全重复的记录,比较容易解决,使用 select distinct * from tableName 就可以得到无重复记录的结果集。

CREATE TABLE tmp SELECT last_name, first_name, sex

FROM person_tbl GROUP BY (last_name, first_name);

DROP TABLE person_tbl;

ALTER TABLE tmp RENAME TO person_tbl;

这种数据量大时比较耗费资源和时间。适合重复数据很多的表。

2.字段重复的:

字段重复,这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下:

假设有重复的字段为Name要求得到这个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name

select * from #Tmp where autoID in(select autoID from #tmp2)

最后一个select即得到了Name不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列,如果要删除库里的重复数据,只要将对应的delectable或drop掉就可以了)。

3.字段重复,删除表中多余的重复记录,要保证(rowname)字段不重复,只留有rowid(标识列)最小的记录

delete from tableName

where rowname in (select rowname from tableName group by rowname

having count(rowname ) > 1)

and rowid not in (select min(rowid) from tableName group by rowname having count(rowname )>1)

本文出处: http://www.toutiao.com/a6394407267379298561/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部