저는 최근에 매우 혼란스러운 상황에 처했습니다. 에의 고유 한 제약 조건이있는 테이블에는이 제약 조건을 위반하는 많은 기존 레코드가 있습니다!고유 한 제약 조건이있는 테이블에 중복 레코드가 있습니다 (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에서이 시나리오를 경험 한 사람이 있습니까?
그래서 ALTER IGNORE가 중복 오류로 실패하고 중복 행 * 및 *을 삭제하지 않고 동시에 고유 색인을 추가합니까? 버그 보고서를 읽으면서 마지막 부분이 그럴 듯하지 않거나 놓쳤습니다. 어쨌든 유용한 참고, 감사합니다. 제약 조건은 처음부터 거의 확실하게 존재하지 않았으므로 가능한 시나리오입니다. –