2013-08-20 4 views
1

기본 키 열과 텍스트 열만있는 테이블이 있습니다. 텍스트 열에 중복 값이있어서 그 값을 없애고 싶습니다. 나는 빨리 내가 ​​조금 주위에 인터넷 검색 테이블에서 중복 제거


을 시도하고 무엇을 가지고

이이었다 대답이었다 내가 생각 발견

ALTER IGNORE TABLE tablename ADD UNIQUE INDEX index_name (column1); 

그러나 실행하려고 후 쿼리가 끝나자 MySQL이 끝났습니다. "# 1062 - 키 'remove_duplicates'"에 대해 중복 항목 '& d'가 있습니다. 그래서 잠시 동안 그걸 들여다 보면서 나는 그것이 효과가 없다는 것을 발견했습니다.

그 후에 나는 tmp 테이블을 만들고 오래된 것을 제거하려고 시도했지만 그 중 하나를 얻지 못했습니다. 무엇

CREATE table `tmp` like `Tag` 

alter table tmp add unique (text) 

INSERT IGNORE INTO `tmp` SELECT * FROM `Tag` 

RENAME TABLE `Tag` TO `deleteme` 
RENAME TABLE `tmp` TO `Tag` 

DROP TABLE `deleteme`; 



내가


열 '텍스트'에 대한 중복 값이없는 테이블 원하는 : I이었다 구문 잘못 입수했습니다 수 있습니다. 이전 방법으로 오류가있는 사람이 있으면 알려주십시오. 다른 방법으로 수행해야한다고 생각되면 알려 주시기 바랍니다.



편집

나는 또한 (내가 아는 매우 중요, 예) 관계가 PK에 매달려있는 것을 언급하는 것을 잊었다


. 다른 테이블과의 관계를 "보존"하는 방법이 있습니까? 필요한 경우 다른 테이블의 ID를 수동으로 변경할 수 있지만이를 변경하는 방법은 훌륭합니다. 당신이 테이블에 삽입 할 때

+0

복제 된 텍스트 값의 경우 보존 할 PK 값을 신경 써야합니까? –

+1

이름에 고유 색인을 추가하는 솔루션은 정확하지만이 오류의 원인이되는 [InnoDB 버전의 MySql에 알려진 버그] (http://bugs.mysql.com/bug.php?id=40344)가 있습니다 메시지. 문제 및 해결 방법은이 답변에 나와 있습니다. (http://stackoverflow.com/a/8053812/1048425) – GarethD

+0

"다른"문제점을 반영하여 제 질문을 업데이트했습니다. – Bono

답변

10

후 중복 제거 :

CREATE table `tmp` like `Tag` 

alter table tmp add unique (text) 

INSERT INTO `tmp` SELECT min(pk), text FROM `Tag` group by text; 

RENAME TABLE `Tag` TO `deleteme` 
RENAME TABLE `tmp` TO `Tag` 

DROP TABLE `deleteme`; 
+0

빠른 질문입니다. 다른 테이블과 관계를 유지합니까? 나는 그것을 언급하는 것을 잊었다. 나는 그들 중 일부는 삭제 될 것이라고 알고 있지만 필요할 경우 수동으로 변경할 수 있습니다. – Bono

+1

최소 기본 키를 기반으로 관계를 유지합니다. 복제물을 사용하는 관계는 보존되지 않습니다. –

+0

왜 이렇게 힘들었 을까? 왜 그냥 테이블에서 삭제를 사용할 수 없습니다 .... 그럼 내가 매뉴얼을 읽었습니다. 새로운 것을 배웠습니다. 감사. – Lobo

0

이 내가 꽤 큰 테이블에 일을 얼마나입니다 난 당신이 열 "ID"

ALTER TABLE Tag ADD UNIQUE INDEX text_id (text, id); 
가 있다고 가정

column1에 UNIQUE INDEX를 작성하십시오. 이드는 다음 쿼리가 더 빨리 실행되어야합니다.

그럼 당신은 당신이 (FIFO가 중요한 대화 인 경우)

INSERT INTO `tmp` SELECT MIN(id), text FROM `Tag` GROUP BY text (Gordon Linoff query) 
실행해야 UNIQUE 첫 번째 행을 얻으려면

SELECT COUNT(*) as "total" - COUNT(DISTINCT text) as "duplicates text" FROM Tag 

테이블 태그에 있었다 얼마나 많은 중복 알고 싶다면

은 (LIFO가 중요한 대화 인 경우) 당신은 실행해야 고유 마지막 행을 얻으려면

INSERT INTO `tmp` SELECT MAX(id), text FROM `Tag` GROUP BY text 

베카 서버가 디스크 임시 테이블을 만들 필요가없는 경우 커버 링 인덱스를 사용하여 사본을 매우 빨리 작성해야합니다 ...

RENAME TABLE `Tag` TO `deleteme` 
RENAME TABLE `tmp` TO `Tag` 

DROP TABLE `deleteme`;