我最近遇到了一个非常令人费解的情况。 在 在2个字段上设置唯一约束的表中,有许多现有记录违反了此约束!
主要问题是: 他们怎么可能首先到达那里,已经有了独特的约束?
架构:
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中可以实现这种情况的场景吗?
答案 0 :(得分: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。