【问题标题】:Table with unique constraint has duplicate records (MySQL 5.1.57)具有唯一约束的表具有重复记录(MySQL 5.1.57)
【发布时间】:2023-03-27 01:33:01
【问题描述】:

我最近遇到了一个非常令人费解的情况。 在一个对 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 rest_service_mediafile MODIFY external_id varchar(255) NULL;

得到约束错误: 错误是:(1062,“密钥‘rest_service_mediafile_video_id_4a2efdd4_uniq’的重复条目‘157165-2’”)

此外,如果我尝试简单地插入重复值,它将正确失败! 你们中有人遇到过这种情况在 MySQL 中是可能的吗?

【问题讨论】:

    标签: mysql unique-constraint duplicate-data


    【解决方案1】:

    是否添加了约束事后

    错误:MySQL 5.1 和 5.5 中的 ALTER IGNORE TABLE t ADD UNIQUE INDEX does not delete duplicate rows

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

    【讨论】:

    • 所以 ALTER IGNORE 因重复错误而失败,是否 删除重复的行 并且 它确实同时添加了唯一索引?通过阅读错误报告,最后一部分似乎并非如此,还是我错过了?无论如何有用的参考,谢谢。几乎可以肯定,从一开始就没有约束,所以这是一种可能的情况。
    猜你喜欢
    • 2020-11-13
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2014-01-12
    相关资源
    最近更新 更多