我主要讲如何防止数据表出现重复数据及如何删除数据表中的重复数据。本文的测试都是居于MySQL数据库的,如果你使用的是Oracle或者SQL Server可以根据具体数据库简单修改sql语句。毕竟重要的是思想。(因全世界排名前三的是这三种数据库,其他数据库这里就不一一提及了)
防止出现重复数据的方式:
值得注意的是,如果我们设置了唯一索引,那么在插入重复数据时,SQL语句将无法执行成功,并抛出错。 mysql提供另一种组织重复数据插入的方式:insert ignore INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
统计重复数据和清除重复数据: 假如我们将统计表中 first_name 和 last_name的重复记录数:
2.使用 DISTINCT 关键字来过滤重复数据
删除重复数据:
对于完全重复的记录,比较容易解决,使用 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/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|