> 데이터 베이스 > 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 데이터베이스에서 중복 행을 제거하면 데이터 무결성이 향상되고 성능이 최적화될 수 있습니다. 특히 "키"라는 특정 열에 제한되지 않은 행과 중복 데이터가 포함된 테이블이 있다고 가정해 보겠습니다. 목표는 중복을 제거하고 각각의 고유한 "키" 값의 단일 인스턴스를 유지하는 것입니다.

단일 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿