MySQL이 중복 행을 삭제하는 방법

How Mysql Delete Duplicate Rows



MySQL은 행과 열이 있는 테이블에 데이터를 저장하는 관계형 데이터 세트입니다. 다만, 데이터베이스에 저장된 데이터는 애플리케이션 또는 사용자의 오류로 인해 중복된 값을 포함할 수 있습니다.

이 자습서에서는 MySQL 데이터베이스에서 중복 행을 제거하여 데이터베이스 크기를 줄이고 서버 성능을 높이는 방법을 배웁니다.







계속하기 전에 다음을 가정합니다.



  1. 시스템에 MySQL이 설치되어 실행 중입니다.
  2. 데이터베이스에 대한 루트 액세스 권한이 있습니다.
  3. 실험 또는 테스트를 위해 데이터베이스에 액세스할 수 있습니다.

노트 : 이 가이드에 제공된 개념을 시도하기 위해 샘플 데이터베이스가 필요한 경우 Sakila 데이터베이스를 고려하거나 이 가이드에 사용된 데이터베이스 복사본을 다운로드하십시오.



리소스는 다음과 같습니다.





기본 사용법

시작하기 전에 테스트 목적으로 중복 값이 ​​포함된 테이블을 의도적으로 만듭니다. 이 작업을 수행하기 위한 SQL 쿼리는 다음과 같습니다.

사용하다 세계;
떨어지다 테이블 만약 존재 사용자;
창조하다 테이블 사용자(ID 지능 기본 키 아니다 없는 자동 증가 ,사용자 이름 바르차르 (10) 아니다 없는 ,성명 바르차르 (스물),이메일 바르차르 (255) 아니다 없는 );
끼워 넣다 안으로 사용자(사용자 이름,성명,이메일) 가치
('처녀 자리', '클로드 M. 모리', ' [이메일 보호됨] '),
('누르다', '티파니 G. 베일리', ' [이메일 보호됨] '),
('로켓', '크리스토퍼 S. 페이튼', ' [이메일 보호됨] '),
('암흑물질', '패트리샤 J. 폭스', ' [이메일 보호됨] '),
('주제', '페이 H. 하틀리', ' [이메일 보호됨] '),
('암흑물질', '패트리샤 J. 폭스', ' [이메일 보호됨] '),
('로켓', '크리스토퍼 S. 페이튼', ' [이메일 보호됨] '),
('아르테미스', '웨슬리 C. 딜라드', ' [이메일 보호됨] ');

필요에 맞게 위의 쿼리를 자유롭게 수정하십시오. 또한 오류를 피하기 위해 생성된 데이터베이스(world)가 있는지 확인해야 합니다.



이제 테이블 내부의 모든 데이터를 사용자 이름순으로 가져오면 다음과 같이 중복 항목이 표시됩니다.

mysql> 사용하다 세계;
데이터 베이스 변경
mysql> 선택하다 * 에서 사용자 주문 사용자 이름;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|사용자 이름|성명|이메일|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |아르테미스|웨슬리 C. 딜라드|[이메일 보호됨]|
| 4 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 6 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 2 |누르다|티파니 G. 베일리|[이메일 보호됨]|
| 5 |주제|페이 H. 하틀리|[이메일 보호됨]|
| |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 7 |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 1 |처녀 자리|클로드 M. 모리|[이메일 보호됨]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

위의 표에서 알 수 있듯이 데이터베이스를 이유 없이 더 크게 만들고 속도를 느리게 만드는 두 개의 중복 값이 ​​있습니다.

이제 이러한 값을 제거하는 방법을 알아보겠습니다.

#1 – 가입 삭제

데이터베이스에서 중복 행을 제거하는 한 가지 방법은 MySQL DELETE JOIN 문을 사용하는 것입니다. 그러나 쿼리는 ID를 사용하여 중복 값을 제거합니다.

예를 들어 위의 users 테이블에서 중복 값을 제거하기 위해 다음을 입력할 수 있습니다.

삭제 1 번 테이블 에서 사용자 테이블1 안의 가입하다 사용자 table2 어디 table1.id<table2.id 그리고 table1.이메일=table2.이메일;

위의 쿼리를 실행하면 아래 출력과 같이 중복 값이 ​​제거됩니다.

mysql> 삭제 1 번 테이블 에서 사용자 테이블1 안의 가입하다 사용자 table2 어디 table1.id<table2.id 그리고 table1.이메일=table2.이메일;
쿼리 확인, 2영향을 받는 행(0.01비서)

mysql> 선택하다 * 에서 사용자 주문 사용자 이름;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|사용자 이름|성명|이메일|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |아르테미스|웨슬리 C. 딜라드|[이메일 보호됨]|
| 6 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 2 |누르다|티파니 G. 베일리|[이메일 보호됨]|
| 5 |주제|페이 H. 하틀리|[이메일 보호됨]|
| 7 |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 1 |처녀 자리|클로드 M. 모리|[이메일 보호됨]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 – Row_Number() 함수

우리가 구현할 수 있는 두 번째 방법은 MySQL row_number() 함수를 사용하는 것입니다. 이 기능은 MySQL 버전 8 이상에서 지원됩니다.

각 행에 순차적 int 값을 할당하여 작동하며 중복 값이 ​​포함된 행은 1보다 큰 값을 얻습니다.

이 기능에 대해 자세히 알아보려면 아래 제공된 리소스를 사용하십시오.

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

중복 값이 ​​있는 행의 ID를 반환하는 아래 쿼리를 고려하십시오.

선택하다 ID 에서 ( 선택하다 ID,ROW_NUMBER()위에( 분할 사용자 이름으로 주문 사용자 이름) 같이 row_var 에서 사용자)t1 어디 row_var> 1;

위의 쿼리를 실행하면 아래 출력과 같이 ID 목록을 가져와야 합니다.

+ ---- +
|ID|
+ ---- +
| 6 |
| 7 |
+ ---- +
2~에 세트 (0.01비서)

값을 제거하려면 아래와 같이 SELECT 문을 DELETE 문으로 바꾸면 됩니다.

삭제 에서 사용자 어디 ID ( 선택하다 ID 에서 ( 선택하다 ID,ROW_NUMBER()위에( 분할 사용자 이름으로 주문 사용자 이름) 같이 row_var 에서 사용자)t1 어디 row_var> 1);

마지막으로 SELECT 문을 사용하여 중복 값이 ​​제거되었는지 확인할 수 있습니다.

mysql> 선택하다 * ~에서 사용자 주문 사용자 이름;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|사용자 이름|성명|이메일|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |아르테미스|웨슬리 C. 딜라드|[이메일 보호됨]|
| 4 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 2 |누르다|티파니 G. 베일리|[이메일 보호됨]|
| 5 |주제|페이 H. 하틀리|[이메일 보호됨]|
| |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 1 |처녀 자리|클로드 M. 모리|[이메일 보호됨]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

결론

이 자습서에서는 데이터베이스에서 중복 값을 제거하는 두 가지 방법에 대해 설명했습니다. 대규모 데이터베이스, 특히 일반적으로 사용되는 데이터베이스에는 외부 가져오기 및 기타 오류에서 많은 중복 값이 ​​포함될 수 있습니다. 따라서 응용 프로그램이 최적의 성능을 발휘할 수 있도록 중복 값을 계속 제거해야 합니다.