MySQL-删除重复数据并保留一条
2018-08-01 本文已影响0人
蜡笔不好吃
问题
这个问题是在思考数据仓库数据更新问题时想到的,导入数据重复的话,要怎样保留一条数据。这个在Power Query中非常简单。
删除重复项
但是在MySQL就没有这么简单了.....
思路
遇到问题当然是先Google或者百度一下
百度给的资料是
# sql删除重复
sql = ''' DELETE FROM table_qj
WHERE qj_id IN (SELECT qj_id FROM table_qj GROUP BY qj_id HAVING count(qj_id)>1)
AND
qj_id NOT IN (SELECT max(qj_time) FROM table_qj GROUP BY qj_id HAVING count(qj_id)>1)
'''
但是在python中报错
Python报错
查了资料原来是MySQL中不能先select一个表,在按此条件进行更新和删除同一个表的记录。
解决办法就是将select得到的结果,再通过中间表select一遍,这样就规避了错误,这个问题只出现于mysql,mssql和oracle不会出现此问题。
不过!
因为我这里的记录是完全相同的,所以不起作用。
后来换了个方法
select distinct * into Tmp from tableName
drop table tableName
select * into tableName from Tmp
drop table Tmp
原来表名tableName,去重查询,然后把结果放到新建表Tmp中,删除原来的表,再把Tmp的数据放到新建表tableName,删除Tmp表。
还是报错
原来但是MySQL不支持 select into
参考资料:https://www.cnblogs.com/jacson/p/4686273.html
改写
Create table tmp (Select distinct * from table_qj)
drop table table_qj
Create table table_qj (Select * from tmp)
drop table tmp
最后想到
我他喵的建两次新表干嘛,重命名就好了
最终版
Create table tmp (Select distinct * from table_qj)
drop table table_qj
RENAME TABLE tmp TO table_qj
总结
这是第一次知道,MySQL能把查询结果存到新建的表中。涨知识了...
然后也开始接触到不同数据库有些语法是执行不了的,像执行查询后删除和select into 这是之前没有碰到的。
另外还需要好好学习,MySQL的增量增加。数据仓库的增量增加。如何实现。