2017년 7월 9일 일요일

Mysql 중복 데이터 하나만 남기고 제거하기


값이 작은 int 나 뭐 varchar 50 이하는 그냥 UNIQ 설정을 하면 그만이지만

text 나  varchar(5000) 뭐 이런애들은 그런 설정이 안되니...

일단 해당애들을 걸러낸다. 필요한것은 인덱스 키와 중복을 판단할 컬럼.

select idx , content, count(*) as cnt from TABLE group by content

--------------------
| idx | content | cnt |
--------------------
| 23 | 11111 | 12 |
| 31 | 2222 | 33 |
| 33 | 3333 | 2 |
| 99 | 4444 | 1 |
--------------------

update TABLE as A,
(select idx , content, count(*) as cnt from TABLE group by content) AS B,
set
A.content = NULL   -- 지우기 쉽게 널로 채움. 바로 지워도되지만 시스템 상 삭제 컬럼을 두고 운영하는 경우가 있으니..
where
A.idx <> B.idx AND  -- 처음 인덱스만 나오니 첫 인덱스만 안겹치면 됨. (나중거를 쓰고 싶으면 MAX 를 사용)
B.cnt > 2 AND         -- 당연히 겹치는 기준인 카운트 2 이상만
A.content = B.content    -- 내용이 같은 놈들.


해서 일단 content 에 NULL 을 넣음.

데이터 확인하고

쿨 하게

delete from TABLE where content IS NULL;

끝.