본문 바로가기
Programing/DB

[MySQL] Table 내의 중복 data 삭제 @

by 꾸압 2022. 11. 22.

 

<올바른 방법>

DELETE
FROM [테이블 이름]
WHERE [인덱스 등 고유 COLUMN 이름] NOT IN
(
  SELECT [인덱스 등 고유 COLUMN 이름] FROM
  (
    SELECT [인덱스 등 고유 COLUMN 이름]
    FROM [테이블 이름]
    GROUP BY [중복 데이터가 있는 COLUMN 이름]
  )
AS [인덱스 등 고유 COLUMN 이름]
);

 

<이건 예시>
DELETE
FROM table_name
WHERE idx NOT IN
(
  SELECT idx FROM
  (
    SELECT idx
    FROM table_name
    GROUP BY name, psw, phone_number
  )
AS idx
);

 


 

<잘못된 방법_1>

  ==> 이거 쓰면 모든 Data가 중복이든 아니든 각 1개씩 삭제됨. 쓰지 말자. --> [오류 출처  steemit yjiq]

DELETE
FROM [중복 제거할 Table Name] 
WHERE [인덱스] IN 
(
    SELECT [인덱스] FROM 
    (SELECT [인덱스] FROM [중복 제거할 Table Name] 
    GROUP BY [중복 제거할 Column Name, 여러개 가능] 
    HAVING count(*) > 1) 
    temp_table
);

 

<이건 예시>
DELETE
FROM test_del
WHERE idx IN 
(
    SELECT idx FROM 
    (
    	SELECT idx FROM test_del
    	GROUP BY city_del, town_del 
    	HAVING count(*) > 1
    ) 
    temp_table
);

 

  ==> 본디 Table 2개를 비교하여 중복 제거를 하지만, Single 이므로 temp_table 이란 임시 테이블을 넣어 Table 자신의 중복만 제거한다.

 


 

<잘못된 방법_2>

  ==> 이거 쓰면 MySQL 이 Deadlock 됨. 자칫 DB가 날아갈 수 있으니 쓰지 말자. --> [오류 출처 : 티스토리, 코딩하는 금융인]

DELETE t1 FROM contacts t1 
JOIN contacts t2
ON t1.first_name=t2.first_name AND t1.last_name=t2.last_name AND t1.email=t2.email
WHERE t1.id > t2.id;

 


 

<참조 1> https://steemit.com/kr/@yjiq150/mysql

<참조 2> https://ellapresso.tistory.com/9

<참조 3> https://codingspooning.tistory.com/entry/MySQL-SQL-%EC%A4%91%EB%B3%B5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EC%B2%98%EB%A6%AC

 

 

'Programing > DB' 카테고리의 다른 글

[MySQL] Event Scheduler  (0) 2022.11.29
[MySQL] Alias  (0) 2022.11.25
[MySQL] Stored Procedure  (0) 2022.11.18
[DB] MySQL Table 구조 및 데이터 복사  (0) 2022.11.16

댓글