欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > PostgreSQL 删除重复数据

PostgreSQL 删除重复数据

2025/3/11 15:40:40 来源:https://blog.csdn.net/2401_83375581/article/details/143323091  浏览:    关键词:PostgreSQL 删除重复数据

我们常常会遇到这样的问题,就是数据重复。然后我们需要对重复数据进行删除。保留最大还是最小则根据具体业务来判断。

假设有表 vbi1 在设计表的时候由于 vbi01 没有被设置为主键,这个时候业务发现 vbi01 重复了,我们需要根据字段 vbi01 来删除重复的 vbi01,保留最早或者最近插入的数据行。

这里我们不得不讲一个关于 PostgreSQL 的知识点,就是即使表在没有设置主键的情况下,PostgreSQL 在底层数据实现上会有一个默认的 CTID 值。

cloud_test=# select ctid,vaf01 from vaf1;
 ctid  |       vaf01
-------+--------------------
 (0,1) | 934376602115133442
 (0,2) | 934376602115133441
 (0,3) | 934376602115133440
 (0,4) | 932591980117118979
 (0,5) | 932591980117118978
 (0,6) | 932591980117118977
(6 rows)

cloud_test=#
备注:这里的 ctid 就是行在底层存储的唯一标识。

需求:对表中重复的数据进行删除保留最小的 CTID 或者最大的 CTID 值。
CREATE INDEX IF NOT EXISTS ix_vbi1_vbi01 ON public.vbi1 USING BTREE(vbi01);
首先我们需要在重复值的字段上创建一个索引,这可以帮助提高删除重复数据的执行效率。

DELETE FROM vbi1 a WHERE a.ctid <> (SELECT min(b.ctid) FROM vbi1 b WHERE a.vbi01 = b.vbi01);
UPDATE vbi1 SET vbi01 = (-1)*vbi1.vbi01 FROM vbi1 b WHERE vbi1.vbi01 = b.vbi01 AND vbi1.ctid < b.ctid
DROP INDEX IF EXISTS ix_vbi1_vbi01;
ALTER TABLE vbi1 ADD PRIMARY KEY(vbi01);

说明:执行删除还是将重复数据前加 - 号根据场景取舍,最后设置表字段为主键或者唯一索引都可以避免后续的数据重复。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词