2012-08-23 82 views
1

我最近遇到了一個相當令人費解的情況。 在擁有的表中,在2個字段中設置了一個唯一約束,因此存在許多違反此約束的現有記錄!具有唯一約束的表具有重複記錄(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 | 
+-------+----------+-------------------+-------------+ 

如果我嘗試像某些領域的ALTER TABLE查詢:

ALTER TABLE rest_service_mediafile MODIFY external_id varchar(255)NULL;

得到約束錯誤: 錯誤是:(1062,「重複條目‘157165-2’關鍵‘rest_service_mediafile_video_id_4a2efdd4_uniq’」)

另外,如果我試圖簡單地插入重複值,它會失敗! 你們中的任何一個人遇到過這種情況,在MySQL中這是可能的嗎?

回答

1

是否增加了約束事後

錯誤:ALTER IGNORE TABLE t ADD UNIQUE INDEX does not delete duplicate rows在MySQL 5.1和5.5中。

這在InnoDB文檔中記錄爲Limitation of Fast Index Creation

+0

因此,ALTER IGNORE失敗,出現重複錯誤,是否*不*刪除重複行*和*它確實在同一時間添加唯一索引?通過閱讀錯誤報告,最後一部分似乎不是這種情況,或者我錯過了它?在任何情況下有用的參考,謝謝。約束幾乎肯定不是從一開始就存在的,所以這是一種可能的情況。 –

相關問題