我最近遇到了一個相當令人費解的情況。 在擁有的表中,在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中這是可能的嗎?
因此,ALTER IGNORE失敗,出現重複錯誤,是否*不*刪除重複行*和*它確實在同一時間添加唯一索引?通過閱讀錯誤報告,最後一部分似乎不是這種情況,或者我錯過了它?在任何情況下有用的參考,謝謝。約束幾乎肯定不是從一開始就存在的,所以這是一種可能的情況。 –