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
, sage
및 semail
의 중복 값을 볼 수 있습니다.
PostgreSQL에서 중복 레코드 찾기
이미 중복 레코드가 포함된 열에 고유 제약 조건을 적용하면 오류가 발생합니다. 나중에 해당 속성에 고유 제약 조건을 적용하려면 다른 레코드가 있어야 합니다.
중복 레코드를 찾는 데는 몇 가지 다른 이유가 있을 수 있습니다. PostgreSQL에서 쿼리를 작성하여 중복 레코드를 필터링할 수 있습니다.
다음 쿼리는 다음과 같습니다.
쿼리 1
중복 레코드를 찾는 데 도움이 되는 매우 기본적인 쿼리는 다음과 같습니다.
SELECT sname, count(*)
FROM Student
GROUP BY sname
HAVING count(*) >1
위의 쿼리는 아주 기본적인 것입니다. sname
열에 따라 데이터를 그룹화하고 동일한 이름을 가진 학생을 찾은 횟수를 표시합니다.
쿼리 결과는 다음과 같습니다.
참고:
sage
열에서 중복을 확인하려면 쿼리에서sname
열로 바꾸십시오. 또한 이름과 나이가 같은 중복 레코드를 찾으려면 쿼리에 두 열을 모두 추가합니다.
쿼리 2
중첩된 쿼리에 정통한 경우 중복 값을 확인하기 위한 쉬운 솔루션일 수 있습니다. 위에서 작성한 것과 유사한 쿼리입니다. 그러나 여기에는 중첩 쿼리의 개념이 포함됩니다.
SELECT *
FROM Student ou
WHERE (
SELECT count(*)
FROM Student inr
WHERE inr.sname = ou.sname
) > 1
쿼리는 예상과 동일한 결과를 제공합니다. 중복 레코드가 있는 sname
의 전체 레코드를 표시합니다.
다른 속성에서 중복 레코드를 찾으려면 위의 쿼리에서 sname
을 선택한 속성으로 바꿀 수 있습니다.
쿼리에서 생성된 결과는 다음과 같습니다.
쿼리 3
여기에서 모든 속성에서 동일한 값을 갖는 전체 중복 레코드를 찾는 것은 간단한 쿼리입니다.
SELECT (Student.*)::text, count(*)
FROM Student
GROUP BY Student.*
HAVING count(*) > 1
위의 쿼리는 모든 속성을 사용합니다. 이 경우 sid
, sname
, sage
및 semail
을 취하고 동일한 레코드가 모든 속성의 정확한 값으로 반복되는 횟수를 계산합니다.
이 스키마에서 sid
속성은 기본 키입니다. 따라서 완전한 레코드 복제를 허용하지 않습니다. 따라서 쿼리는 결과를 생성하지 않습니다.
쿼리 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
, sage
및 semail
을 표시하는 중첩 쿼리입니다. 쿼리 결과는 다음과 같습니다.
PostgreSQL에서 중복 레코드 삭제
중복 레코드를 찾은 후 테이블에서 삭제할 수 있습니다. 여러 쿼리를 사용하여 중복 레코드를 삭제할 수 있습니다. 그러나 이 문서에는 이러한 쿼리가 하나만 포함되어 있습니다.
쿼리 1
위에서 언급한 네 가지 쿼리는 중복 레코드를 삭제하도록 조정하여 사용할 수 있습니다. 연습으로 이러한 쿼리를 직접 시도하고 실험할 수 있습니다.
이 문서의 테이블에서 중복 레코드를 삭제하는 다른 쿼리를 포함했습니다.
DELETE
FROM Student s1
USING Student s2
WHERE s1.sname = s2.sname AND s1.sid < s2.sid
위 쿼리는 A
라는 이름의 Student
테이블에서 하나의 레코드를 삭제합니다. 쿼리는 최신 레코드를 제외한 모든 레코드를 삭제하고 성공 메시지를 생성합니다.
삭제 후 테이블의 상태는 다음과 같습니다.
결론
수많은 쿼리를 사용하여 데이터베이스에서 중복 레코드를 찾을 수 있습니다. 이러한 쿼리를 조정하면 해당 레코드도 삭제할 수 있습니다.
다양한 쿼리를 계속 실험하여 요구 사항에 가장 적합한 쿼리를 찾으십시오.
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