首页 > 数据库 > mysql教程 > 如何从 PostgreSQL 表中删除重复行,同时保留唯一列?

如何从 PostgreSQL 表中删除重复行,同时保留唯一列?

Mary-Kate Olsen
发布: 2025-01-19 02:43:10
原创
159 人浏览过

How to Delete Duplicate Rows from a PostgreSQL Table While Preserving a Unique Column?

从具有唯一列的小表中删除重复行

在PostgreSQL数据库中,消除重复行可以增强数据完整性并优化性能。假设您有一个表,其中包含不受约束的行和重复数据,尤其是在名为“key”的特定列中。目标是删除重复项并保留每个唯一“key”值的单个实例。

单一SQL命令解决方案

要使用单个SQL命令执行此操作,可以使用以下步骤:

1. 识别首次重复出现: 首先,我们需要识别每个重复行的第一次出现。此信息对于保留数据的单个副本至关重要。

<code class="language-sql">SELECT MIN(ctid) AS ctid, key
FROM dups
GROUP BY key HAVING COUNT(*) > 1;</code>
登录后复制

2. 删除非首次出现: 一旦识别出第一次出现,我们就可以根据它们的“ctid”值删除所有后续的重复项。“ctid”列表示行在表中的物理位置。

<code class="language-sql">DELETE FROM dups a USING (
    SELECT MIN(ctid) AS ctid, key
    FROM dups
    GROUP BY key HAVING COUNT(*) > 1
) b
WHERE a.key = b.key
AND a.ctid <> b.ctid;</code>
登录后复制

考虑行顺序

虽然此方法有效地删除了重复项,但它不能确保在多次出现的情况下保留哪一行。如果存在选择保留行的特定标准,则应将其合并到查询中。

示例:

为了更好地理解,请考虑以下示例:

<code class="language-sql">CREATE TABLE people (
    name    VARCHAR(50) NOT NULL,
    surname VARCHAR(50) NOT NULL,
    age     INTEGER NOT NULL
);

INSERT INTO people (name, surname, age) VALUES
    ('A.', 'Tom', 30),
    ('A.', 'Tom', 10),
    ('B.', 'Tom', 20),
    ('B', 'Chris', 20);

-- 显示重复项的第一次出现:
SELECT MIN(ctid) AS ctid, name, surname
FROM people
GROUP BY (name, surname) HAVING COUNT(*) > 1;

-- 删除重复项的非第一次出现:
DELETE FROM people a USING (
    SELECT MIN(ctid) AS ctid, name, surname
    FROM people
    GROUP BY (name, surname) HAVING COUNT(*) > 1
) b
WHERE a.name = b.name
AND a.surname = b.surname
AND a.ctid <> b.ctid;

SELECT * FROM people;</code>
登录后复制

此示例表包含可能重复的个人数据。执行第二个查询后,重复项将被删除,并且表中只剩下唯一的姓名和姓氏。

以上是如何从 PostgreSQL 表中删除重复行,同时保留唯一列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板