【PgSQL】- 删除完全重复的数据(连id都一样)仅保留一条

写在前面

  写这篇文章的目的是因为在删除重复数据时,遇到了Pg数据库delete语句后面不支持limit关键字。本文适应于有一定工作经验且有SQL基础的同学。



一、场景描述

  最近接手了一个老项目,在分析存储过程的时候,发现Pg数据库中有一张配置表出现了 完全相同(所有字段,连id都一样) 的数据。其结果造成前端页面展示时,下拉框出现了重复值。那么面临的问题,很显然就是如何删除重复的数据?


二、问题分析

  常规思路:数据重复了,那我把多余的查出来,删了不就完事儿了,开始写sql。首先group by,通过having count(*) > 1的,找到重复数据的id(本文中的这个场景,id值也重复);然后 DELETE FROM table WHERE id = ? LIMIT ?;

select * from table group by ... having count(*) > 1;
delete from table where id = ? limit ?;

  但是,在执行delete 语句时报错了,错误是ERROR: syntax error at or near "limit"。经资料查询,MySQL支持delete后面加limit ,而PgSQL 在update/delete后面均不支持limit。 怎么搞?

!注意:数据无价,更新删除操作前,请先备份数据。


三、解决思路

  由于行记录没有唯一属性,既然在当前表中不能直接操作数据,那么我就先建立一张临时表,把去除重复发后的数据取出来放到临时表中。然后删除原表中的数据,再把临时表中的数据倒腾回去,最后删除临时表。下面,用一个简单的例子演示一下。


四、具体步骤

1.环境说明

名称说明
数据库版本PostgreSQL 12.3

2.创建表/初试化数据

CREATE TABLE code
(
  id CHARACTER VARYING(255)
);

INSERT INTO code
VALUES
(1),
(2),
(3),
(4),
(3),
(4),
(1),
(1);

3.查看表数据

SELECT * FROM code;

在这里插入图片描述

4.清洗数据

CREATE TABLE temp
(
  id CHARACTER VARYING(255)
);

INSERT INTO temp
SELECT * FROM code WHERE id NOT in (
	SELECT id FROM code GROUP BY id HAVING COUNT(*) > 1
)
UNION
SELECT * FROM code GROUP BY id HAVING COUNT(*) > 1;

TRUNCATE TABLE code;

INSERT INTO code
SELECT * FROM temp;

DROP TABLE temp;

5.查看表数据

SELECT * FROM code;

在这里插入图片描述


五、总结

  出现以上的问题,根源在于表结构在最初设计时没有考虑唯一约束,导致多人维护出现数据重复,因此在建表时,一定要建主键或者唯一索引保证记录的唯一性。


六、参考资料

MySQL 5.7 Reference Manual


写在后面

  如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值