2012-08-23 2 views
1

저는 최근에 매우 혼란스러운 상황에 처했습니다. 의 고유 한 제약 조건이있는 테이블에는이 제약 조건을 위반하는 많은 기존 레코드가 있습니다!고유 한 제약 조건이있는 테이블에 중복 레코드가 있습니다 (MySQL 5.1.57)

그리고 가장 중요한 질문은 다음과 같습니다. 고유 한 제약 조건이 이미 자리 잡은 상태에서 처음에는 어떻게 얻을 수 있었습니까?

스키마 :

CREATE TABLE `rest_service_mediafile` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `video_id` int(11) NOT NULL, 
    `video_encoding_id` int(11) NOT NULL, 
    `external_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `rest_service_mediafile_video_id_4a2efdd4_uniq` (`video_id`,`video_encoding_id`), 
    KEY `rest_service_mediafile_5d9d774` (`video_id`), 
    KEY `rest_service_mediafile_62de6709` (`video_encoding_id`), 
    CONSTRAINT `video_encoding_id_refs_id_3122bd65` FOREIGN KEY (`video_encoding_id`) REFERENCES `rest_service_videoencoding` (`id`), 
    CONSTRAINT `video_id_refs_id_567c8704` FOREIGN KEY (`video_id`) REFERENCES `rest_service_video` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=93154 DEFAULT CHARSET=utf8 

샘플 쿼리 :

: (하지만이 유일한 중복이 아닌)

mysql> select id, video_id, video_encoding_id, external_id from rest_service_mediafile where video_id = 157165 and video_encoding_id=2; 
+-------+----------+-------------------+-------------+ 
| id | video_id | video_encoding_id | external_id | 
+-------+----------+-------------------+-------------+ 
| 82416 | 157165 |     2 |   0 | 
| 82424 | 157165 |     2 |   0 | 
+-------+----------+-------------------+-------------+ 

그리고 같은 일부 필드에 테이블 변경 쿼리를 시도하는 경우 변경 테이블 rest_service_mediafile 수정 external_id varchar (255) NULL;

I 제약 오류가 발생합니다 : 오류였다 (1062, "키 'rest_service_mediafile_video_id_4a2efdd4_uniq'에 대한 중복 항목을 '157165-2'") 또한 단순히 중복을 삽입하려고하면

가치, 그것은 정확하게 실패 할 것이다! MySQL에서이 시나리오를 경험 한 사람이 있습니까?

답변

1

제약 조건을 추가 했습니까 post hoc?

MySQL 5.1 및 5.5의 버그 : ALTER IGNORE TABLE t ADD UNIQUE INDEX does not delete duplicate rows.

이것은 InnoDB 문서에 Limitation of Fast Index Creation으로 기록되어 있습니다.

+0

그래서 ALTER IGNORE가 중복 오류로 실패하고 중복 행 * 및 *을 삭제하지 않고 동시에 고유 색인을 추가합니까? 버그 보고서를 읽으면서 마지막 부분이 그럴 듯하지 않거나 놓쳤습니다. 어쨌든 유용한 참고, 감사합니다. 제약 조건은 처음부터 거의 확실하게 존재하지 않았으므로 가능한 시나리오입니다. –

관련 문제