2014-12-15 9 views
1

중복 된 MySQL에 테이블이 있습니다. 중복을 삭제하고 하나의 항목을 유지하려고합니다. 내가이없는 기본 키MySQL 중복 오류 테이블과 중복 오류가 발생했습니다.

내가하여 중복을 finde 수 있습니다

select user_id, server_id, count(*) as NumDuplicates 
from user_server 
group by user_id, server_id 
having NumDuplicates > 1 

그러나 그들을 삭제할 수 없습니다 :

ALTER IGNORE TABLE `user_server` 
ADD UNIQUE INDEX (`user_id`, `server_id`); 

에도 SET FOREIGN_KEY_CHECKS = 0; 작동 안됨. 오류 코드 : 키 'user_id_3'

MySQL 버전에 대한 1062 중복 항목 '142-20': 5.5.18 엔진 :

이노

는 다른 방법이 있나요?

+0

당신이 동일하게 행을 삭제할 또는 서로 다른 값을 가진 열이 어떻게 수행 작업을합니까? – hellcode

+0

동일하게 행이 있지만 중복 중 하나를 유지하십시오. – blubbering

+0

동일한 동작이 표시됩니다.이 경우 중복 변경 표가 제거되지 않는 이유는 누구나 설명 할 수 있습니까? – Whit

답변

3

아마 가장 쉬운 방법은, 테이블의 구조를 복사하여 새 테이블에 고유 인덱스를 추가하는 것입니다 :

INSERT IGNORE INTO new_table SELECT * FROM old_table 

는 (각 중 하나 제외) 중복을 삭제하려면없이 임시 테이블을 생성, 당신은 그렇게 할 수 있습니다

ALTER TABLE `user_server` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; 

DELETE us2 FROM user_server us1 
JOIN user_server us2 USING (user_id, server_id) 
WHERE us1.id < us2.id; 

ALTER TABLE `user_server` DROP `id`; 
+0

나는 테이블을 복사하지 않고 방법을 찾고 다시 이름을 바꿉니다. 다른 모든 것이 작동하지 않는 경우에만. – blubbering

0

또 다른 솔루션의 user_server에 있던 모든 인덱스를 유지하는 것은 :

CREATE TABLE new_user_server LIKE user_server; 
ALTER TABLE new_user_server ADD UNIQUE INDEX (`user_id`, `server_id`); 
INSERT IGNORE INTO new_user_server SELECT * FROM user_server; 
DROP TABLE user_server; 
RENAME TABLE new_user_server TO user_server; 
4

당신이 INNO DB를 사용하기 때문에 그것은,의

간단한 트릭 :

set session old_alter_table=1; 
ALTER IGNORE TABLE `user_server` 
ADD UNIQUE INDEX (`user_id`, `server_id`); 
set session old_alter_table=0; 

이것은

+1

이것은 나를 위해 일했습니다. –