postgresql 删除重复数据(完全一样)仅保留一条

写这篇文章的目的主要是致力于提供一个开阔的思路,本文适应于有一定工作经验且有SQL基础的童靴。如果你想要照搬,Copy,那么你可以跳过下面的内容了。

一 、问题描述

最近接手的老项目,在分析存储过程时,发现pg数据库中有一张配置表出现了完全相同 [所有字段都一样] 的数据(根据group by分组得知)重复1次,其结果造成前端页面展示时下拉框出现重复值。那么,面临的问题,很显然就是如何删除多余的1条数据?

二、解决方案

通常的思路:多余1条,我把多余的查出来,删了不就完事儿了,开始码SQL。请注意:数据无价,备份数据。
首先group by,通过having count(*) > 1的,找到重复数据的id(本文中的这个场景,id值也重复),然后 DELETE FROM table WHERE id = ‘’ LIMIT 1;
执行上面的SQL,结果显示error,语法错误。
经资料查询,mysql支持delete后面加limit MySQL 5.7 Reference Manual,而pgsql 在update/delete后面均不支持limit。 怎么搞?

1)思路1:先把数据取出来,通过临时表来搞定
首先创建一张临时表[temp],用于备份去重后的数据
insert into temp
select * from table where id not in ()
union
select … from table
group by … having count(*) > 1
然后删除原表中的数据,再把临时表temp的数据倒腾回去。

2)思路2:数据不是太多,全删掉,再重新插入
你不是重复吗,我没法直接删除。那我就釜底抽薪,全给你删掉,然后再重新插入
首先根据group by having 得到重复id,select * from table where id IN (’’), 这里我们可以借助Navicate工具导出SQL,目前pgAdminIII 暂未找到导出功能。然后整理去掉导出SQL中重复的数据。最后先删除原表中重复数据,再用去重后的SQL插入新数据。

三、小结

  • 君子性非异也,善假于物也。要善于利用工具
  • 多个方案,多条路。

四、参考资料

如果说我看得比别人更远些,那是因为我站在巨人的肩膀上 ——牛顿
MySQL 5.7 Reference Manual

你可能感兴趣的:(SQL,删除重复数据仅保留一条,postgresql,delete,limit)