mysql - 具有唯一约束的表有重复记录(MySQL 5.1.57)

标签 mysql unique-constraint duplicate-data

我最近遇到了一个很费解的情况。 在一个对 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,“键‘rest_service_mediafile_video_id_4a2efdd4_uniq’的重复条目‘157165-2’”)

此外,如果我尝试简单地插入一个重复值,它将正确失败! 你们中有人遇到过在 MySQL 中可以做到这一点的场景吗?

最佳答案

约束是事后添加的吗?

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

这在 InnoDB 文档中被标记为 Limitation of Fast Index Creation .

关于mysql - 具有唯一约束的表有重复记录(MySQL 5.1.57),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12099230/

相关文章:

mysql - 如何通过SQL查询检查列的数值是否包含字母

ruby-on-rails - 如何在 Ruby on Rails 中验证一对 id 的唯一性?

php - MySQL 中的重复数据停止

python - 检测不同结构表之间数据冗余的方法

android - 如何检查android数据库中的重复名称?

Mysql 查询不在 WHERE 上返回结果,而是在 AND 上返回结果

mysql - 在多列上连接大量表的策略?

php - 单击按钮后获取 url 部分

MySQL 唯一约束,在更新时,将退出设置为 NULL

sql - 添加特殊约束以避免出现这种情况的重复行?