postgresql - 如何在没有主键的 PostgreSQL 表中删除 100% 重复的行?
问题描述
我有一个包含大量列的 PostgreSQL 表。该表没有主键,现在包含几行,这些行与另一行 100% 重复。
如何删除这些重复项而不删除原始项?
我在一个相关问题上找到了这个答案,但我必须拼出每个列名,这很容易出错。我怎样才能避免对表结构有所了解?
例子:
给定
create table duplicated (
id int,
name text,
description text
);
insert into duplicated
values (1, 'A', null),
(2, 'B', null),
(2, 'B', null),
(3, 'C', null),
(3, 'C', null),
(3, 'C', 'not a DUPE!');
删除后,应保留以下行:
(1, 'A', null)
(2, 'B', null)
(3, 'C', null)
(3, 'C', 'not a DUPE!')
解决方案
如this answer中所建议的,使用系统列ctid
来区分其他相同行的物理副本。
为了避免为行拼写一个不存在的“键”,只需使用行构造函数 row(table)
,它返回一个包含整个行的行值,如下所示select * from table
:
DELETE FROM duplicated
USING (
SELECT MIN(ctid) as ctid, row(duplicated) as row
FROM duplicated
GROUP BY row(duplicated) HAVING COUNT(*) > 1
) uniqued
WHERE row(duplicated) = uniqued.row
AND duplicated.ctid <> uniqued.ctid;
您可以在此DbFiddle中尝试。
推荐阅读
- unity3d - unity3d 从 web 加载 spritesheet 和内存问题
- python - Python 等待 Slurm 工作?
- mysql - 我想导出没有“b”的csv文件
- html - 使用水平滚动固定的响应式和表头的引导表
- java - Mockito 如何将类型传递给返回 CompleteableFuture 的通用 supplyAsync 方法?
- php - Get the top selling product's current inventory in mysql
- python-3.x - 如何允许 python 递归计算超出设置的递归限制?
- python - Fabric - 将变量导出到 virtualenv
- javascript - Can't reference proprety name with '-' Nodejs
- android - 也为带有子文件夹的应用程序创建图库?