PostgreSQL의 데이터베이스에서 중복 레코드 찾기 및 삭제

Bilal Shahid 2024년2월15일
  1. PostgreSQL 데이터베이스 스키마
  2. PostgreSQL 데이터베이스 상태
  3. PostgreSQL에서 중복 레코드 찾기
  4. PostgreSQL에서 중복 레코드 삭제
  5. 결론
PostgreSQL의 데이터베이스에서 중복 레코드 찾기 및 삭제

이 문서에서는 여러 명령을 사용하여 PostgreSQL에서 중복 레코드를 찾고 삭제하는 방법에 대해 설명합니다.

수많은 쿼리를 작성하고 데이터베이스에서 중복 레코드를 찾는 데 사용할 수 있습니다. 그런 다음 동일한 쿼리를 조정하여 데이터베이스의 중복 레코드를 삭제할 수 있습니다.

중복 레코드를 찾는 데 도움이 되는 일부 쿼리가 아래에 언급되어 있습니다. 동일한 목적을 위해 다양한 대체 쿼리가 존재하므로 계속 실험하고 새로운 솔루션을 찾을 수 있습니다.

PostgreSQL 데이터베이스 스키마

아래에 디자인된 스키마는 쿼리에만 집중할 수 있도록 문서 전체에서 따를 것입니다. 모든 쿼리는 스키마에 따라 설계되어 쿼리 작업을 더 잘 이해할 수 있습니다.

CREATE TABLE Student (
    sid INT PRIMARY KEY,
    sname VARCHAR (50),
    sage INT,
    semail VARCHAR(80)
);

PostgreSQL 데이터베이스 상태

다음 레코드가 Student 테이블에 추가되어 레코드로 채워집니다.

INSERT INTO Student VALUES (1, 'A', 15, 'a@gmail.com');
INSERT INTO Student VALUES (2, 'A', 17, 'ab@gmail.com');
INSERT INTO Student VALUES (3, 'B', 17, 'b@gmail.com');
INSERT INTO Student VALUES (4, 'AB', 21, 'ab@gmail.com');

데이터베이스 스키마와 상태는 테이블의 sid 열만 고유함을 명확하게 보여줍니다. 그렇지 않으면 모든 열이 중복 레코드를 보유할 수 있습니다.

모든 레코드를 성공적으로 삽입한 후 Student 테이블의 상태는 다음과 같습니다.

학생 상태

sname, sagesemail의 중복 값을 볼 수 있습니다.

PostgreSQL에서 중복 레코드 찾기

이미 중복 레코드가 포함된 열에 고유 제약 조건을 적용하면 오류가 발생합니다. 나중에 해당 속성에 고유 제약 조건을 적용하려면 다른 레코드가 있어야 합니다.

중복 레코드를 찾는 데는 몇 가지 다른 이유가 있을 수 있습니다. PostgreSQL에서 쿼리를 작성하여 중복 레코드를 필터링할 수 있습니다.

다음 쿼리는 다음과 같습니다.

쿼리 1

중복 레코드를 찾는 데 도움이 되는 매우 기본적인 쿼리는 다음과 같습니다.

SELECT sname, count(*)
FROM Student
GROUP BY sname
HAVING count(*) >1

위의 쿼리는 아주 기본적인 것입니다. sname 열에 따라 데이터를 그룹화하고 동일한 이름을 가진 학생을 찾은 횟수를 표시합니다.

쿼리 결과는 다음과 같습니다.

PostgreSQL 중복 찾기 - 쿼리 1

참고: sage 열에서 중복을 확인하려면 쿼리에서 sname 열로 바꾸십시오. 또한 이름과 나이가 같은 중복 레코드를 찾으려면 쿼리에 두 열을 모두 추가합니다.

쿼리 2

중첩된 쿼리에 정통한 경우 중복 값을 확인하기 위한 쉬운 솔루션일 수 있습니다. 위에서 작성한 것과 유사한 쿼리입니다. 그러나 여기에는 중첩 쿼리의 개념이 포함됩니다.

SELECT *
FROM Student ou
WHERE (
    SELECT count(*)
    FROM Student inr
    WHERE inr.sname = ou.sname
) > 1

쿼리는 예상과 동일한 결과를 제공합니다. 중복 레코드가 있는 sname의 전체 레코드를 표시합니다.

다른 속성에서 중복 레코드를 찾으려면 위의 쿼리에서 sname을 선택한 속성으로 바꿀 수 있습니다.

쿼리에서 생성된 결과는 다음과 같습니다.

PostgreSQL 중복 찾기 - 쿼리 2

쿼리 3

여기에서 모든 속성에서 동일한 값을 갖는 전체 중복 레코드를 찾는 것은 간단한 쿼리입니다.

SELECT (Student.*)::text, count(*)
FROM Student
GROUP BY Student.*
HAVING count(*) > 1

위의 쿼리는 모든 속성을 사용합니다. 이 경우 sid, sname, sagesemail을 취하고 동일한 레코드가 모든 속성의 정확한 값으로 반복되는 횟수를 계산합니다.

이 스키마에서 sid 속성은 기본 키입니다. 따라서 완전한 레코드 복제를 허용하지 않습니다. 따라서 쿼리는 결과를 생성하지 않습니다.

PostgreSQL 중복 찾기 - 쿼리 3

쿼리 4

특정 테이블에서 중복 레코드를 찾는 데 사용할 수 있는 또 다른 쿼리는 다음과 같습니다.

SELECT *
FROM (
    SELECT sname, sage, semail, ROW_NUMBER() OVER
        (
        PARTITION BY sname
        ORDER BY sname, sage, semail ASC
        ) AS Row FROM Student
    ) dups
WHERE dups.Row >1

중복 행을 찾아 중복 레코드의 sname, sagesemail을 표시하는 중첩 쿼리입니다. 쿼리 결과는 다음과 같습니다.

PostgreSQL 중복 찾기 - 쿼리 4

PostgreSQL에서 중복 레코드 삭제

중복 레코드를 찾은 후 테이블에서 삭제할 수 있습니다. 여러 쿼리를 사용하여 중복 레코드를 삭제할 수 있습니다. 그러나 이 문서에는 이러한 쿼리가 하나만 포함되어 있습니다.

쿼리 1

위에서 언급한 네 가지 쿼리는 중복 레코드를 삭제하도록 조정하여 사용할 수 있습니다. 연습으로 이러한 쿼리를 직접 시도하고 실험할 수 있습니다.

이 문서의 테이블에서 중복 레코드를 삭제하는 다른 쿼리를 포함했습니다.

DELETE
FROM Student s1
USING Student s2
WHERE s1.sname = s2.sname AND s1.sid < s2.sid

위 쿼리는 A라는 이름의 Student 테이블에서 하나의 레코드를 삭제합니다. 쿼리는 최신 레코드를 제외한 모든 레코드를 삭제하고 성공 메시지를 생성합니다.

삭제 후 테이블의 상태는 다음과 같습니다.

PostgreSQL 중복 삭제

결론

수많은 쿼리를 사용하여 데이터베이스에서 중복 레코드를 찾을 수 있습니다. 이러한 쿼리를 조정하면 해당 레코드도 삭제할 수 있습니다.

다양한 쿼리를 계속 실험하여 요구 사항에 가장 적합한 쿼리를 찾으십시오.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

관련 문장 - PostgreSQL Database