MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考。
第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表
1 create table tmp3 as select min(id) as col1 from data_content_152 group by SFZHM;
第二步:创建新表RES
1234 CREATE TABLE `res` (`id` int(11),`sfz` char(20)) ENGINE=MyISAM;
第三步:把TMP3表ID对应到data_content_152里需要提取的数据添加到RES表的SFZ字段
1 INSERT INTO res (sfz) SELECT sfzhm FROM data_content_152,tmp3 where data_content_152id=tmp3col1
至此,就在MYSQL里实现了,给数据表data_content_152完全删除重复数据,把去重复后的数据导入到RES表。
你要先找到规律,并且有确定的限制条件。是否所有的重复数据都删了只留一条?旧数据和新数据的界定是什么?是某个时刻?那旧数据中有重复数据删不删?重复数据是指仅仅title字段信息一样?
如果是在工作上,删除数据是一项很严谨的事,这个你必须要想清楚所有的条件情况,只是这样几句话,让网友给个sql语句,直接用上去,害的是你自己。
也不知道你的数据库具体是怎么样的,给个一般删除重复数据的方法
select distinct into #Tmp_aa from tableName 把不重复的找出来插入到临时表
drop table tableName 删掉原来的表
select into tableName from #Tmp_aa 把临时表插入到新建的tableName
drop table #Tmp_aa 删掉临时表
当我们用navicat工作时,会出现Duplicate entry "1" for key "PRIMARY"的错误,网上有很多解决的办法,我这里有两个解决方法,希望对你们有用。
1,“primary”顾名思义是主键的问题,可以将这张表设为无主键,就是把主键给删了不要了,但是这种方法不怎么好用,存在一些bug,而且大部分数据表都是需要主键的,所以不太推荐大家使用这种方法。
2,因为主键(primary)是唯一的,但我们点击刷新或运行的时候,系统就会认为我们又创建一个主键,导致出错,解决办法:我们可以输入“DELETE FROM Table_name”,delete语句是MySQL常用的删除 *** 作,我们可以用它删除表中的所有记录,delete语句运行之后,这样所有的记录全部删除了,我们可以再重新在设一个主键,就OK了,切记我们不要频繁的点击刷新和运行,要当我们代码写得差不多了,再点击刷新或运行,不然还会出现这种问题,不过用delete语句就可以了,只要你不嫌麻烦就行。
第一次写文章,我是很想帮助大家,仅拼个人理解,第二个方法是和同学们交流学习得来的,所以一些不足之处,希望大家多多担待。谢谢!
这个需要分情况。1,你的数据库表中有主键,且主键上面的数据为唯一值。也就是没有重复值。那么你在删除的时候,将这个唯一值作为条件进行删除。如: delete from [表名] where id=12所有的数据相同,那么你只能打开数据表,手工选定其中某一条,进行删除。
如何查找和删除数据库中的重复数据
以Excel2010版本为例,可以直接使用数据→删除重复项的功能来实现删除重复数据。
此功能Excel2007及以上版本均可,WPS中也有这样的功能。另外还可以使用公式法去重复,常用的函数是Countif函数。
首先,先说明一个问题。这样的结果出现,说明系统设计是有问题的。
其次
删除重复数据,你要提供你是什么数据库。
不同数据库会有不同的解决方案。
关键字Distinct 去除重复,如下列SQL,去除Test相同的记录;
1 select distinct Test from Table
2 如果是要删除表中存在的重复记录,那就逻辑处理,如下:
3 select Test from Table group by Test having count(test)>1
4 先查询存在重复的数据,后面根据条件删除
还有一个更简单的方法可以尝试一下:
select aid, count(distinct uid) from 表名 group by aid
这是sqlserver 的写法。
如图一在数据表中有两个膀胱冲洗重复的记录。
2
可以通过sql语句“select from 表名 where 编码 in(select 编码 from 表名 group by 编码 having count(1) >= 2)”来查询出变种所有重复的记录如图二
3
通过sql语句"
delete from 表名 where
编码 in(select 编码 from 表名 group by 编码 having count(1) >= 2)
and 编码 not in (select max(编码)from 表名 group by 编码 having count(1) >=2)
"来删除重复的记录只保留编码最大的记录
首先是将数据库里边的重复记录删掉,我看网上有好多答案是这样的:
1 delete from people
2 where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
3 and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
但其实我每次运行这条语句都是行不通的,会报错:
SQL 错误 [1093] [HY000]: You can't specify target table 'test1' for update in FROM clause
javasqlSQLException: You can't specify target table 'test1' for update in FROM clause
去网上查过好像是说update以及delete *** 作没办法跟查询 *** 作一起做的,我看过有的更新的跟查询的一起做的好像是给查出来的那部分起个别名,然后进行更新就可以了,但是删除这个我起了别名也不对,不知道是我写错还是不行,我就跳过这个方法了。
我用的方法是:先查出数据库中的重复记录的数据中的一条,这个不难,很简单的,sql语句如下:
select from test1 where name in (select name from test1 group by name having count(name) > 1)
and id in (select min(id) from test1 group by name having count(name)>1)
结果如下:
id |name |phont |
---|--------|-------|
1 |name22 |123 |
3 |name222 |123 |
5 |name2 |123123 |
8 |123 |123123 |
11 |name1 |123123 |
13 |111 |1231 |
14 |112 |1232 |
这些都是不重复的,换句话说都是要保留的,不被删掉的,而其余与这些结果中name相同的应该被删掉。
也就是说将上边那个sql语句id后边加一个not ,查出来的结果就是要删掉的:结果如下
id |name |phont |
---|--------|-------|
2 |name22 |123 |
4 |name222 |123 |
6 |name2 |123123 |
7 |name2 |NULL |
9 |123 |123123 |
10 |123 |123123 |
12 |name1 |123123 |
15 |111 |1233 |
16 |112 |1234 |
17 |111 |1235 |
18 |112 |1236 |
我把这些需要删掉的存到另外一个表里,然后我新建一个test2表,结构复制test1的结构就好了
1 CREATE TABLE `test2` (2 `id` int(11) NOT NULL AUTO_INCREMENT,3 `name` varchar(50) DEFAULT NULL,4 `phont` varchar(50) DEFAULT NULL,5 PRIMARY KEY (`id`)6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后插入语句是:
1 insert into test2(2 select from testtest1 where name in (select name from testtest1 group by name having count(name) > 1)
3 and id not in (select min(id) from testtest1 group by name having count(name)>1)
4 )
然后test2的表里的数据就是下图这样的:
那接下来做的就是删掉test1表里边与test2表的id相同的数据。
1 delete a from test1 a, test2 b where aid = bid ;
这样,test1里边的数据就变成了:
这样的结果就是完全不重复的,但是我还想要他们的id是连续的,而不是这样的断开的。
我的做法是将这个表的除掉id之外的所有字段查出插入到另外一个表test3中,当然,test3要设置id为自增主键,但是不插入id,让它自增,就连续了
当然要新建表test3啦,不过把上边新建的test2那个复制下来改名字为test3就好啦。
然后插入:
1 insert into test3(name, phont)2 (select name, phont from test2)
test3表里的结果就是:
这样就可以把test3改成你想要的名字,然后删掉test1和test2了,大功告成~
不过感觉还可以就是将已经删掉重复数据的表test1的数据全都导出来,一般的数据库连接工具都有这样的功能,导成sql格式的,然后新建一个表,比test1多增一个自增主键字段叫NewId字段,但是Id字段不能再自增了,然后将导成的sql文件导入,不过那个sql文件可能要编辑一下,改一下自增主键id变为普通的字段什么的,然后到新表了之后,删掉id字段,修改NewId为Id,应该也可以,但是这个方法我没试过,原先预想过要这么做但是没有这么做,估计以后可以试试,但是感觉两种的麻烦程度都差不多啊,但是如果将sql语句写下来之后可能还是第一种方法比较快一点吧。
1、必须保证表中有主键或者唯一索引,或者某列数据不能重复。只有这样,才可能使用一句SQL来实现。否则只能考虑其它办法。下面的语句,假定BB列是不重复的,删除后保存BB列值最大的那条记录。
delete
from
表
where
aa
in
(select
aa
from
表
group
by
aa
having
count(aa)
>
1)
and
bb
not
in
(select
max(bb)
from
表
group
by
aa
having
count(aa)
>
1);
2、有多种写法:
delete
A
from
B
where
AAA
=
BAA
delete
A
from
A,B
where
AAA
=
BAA
delete
A
where
AA
in
(select
AA
from
B)
3、使用into关键字:
select
into
新表名
from
原表
4、取数据前3位,字段必须是类似char类型,使用类似substring这样的函数(SYBASE是substring,ORACLE是substr):
select
substring(字段,1,3)
from
表名
以上就是关于怎么删除重复的Mysql数据全部的内容,包括:怎么删除重复的Mysql数据、sql删除数据库中重复的数据语句怎么写、怎么用navicat删除数据表中的重复值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)