values two index example constraint columns across mysql unique-constraint duplicate-data

two - unique field mysql



La tabla con restricción única tiene registros duplicados(MySQL 5.1.57) (1)

¿Se agregó la restricción post hoc ?

Error: ALTER IGNORE TABLE t ADD UNIQUE INDEX no elimina las filas duplicadas en MySQL 5.1 y 5.5.

Esto se observa en los documentos de InnoDB como una limitación de la creación rápida de índices .

Recientemente me encontré con una situación bastante desconcertante. En una tabla que tiene un conjunto de restricciones único en 2 campos, ¡hay muchos registros existentes que infringen esta restricción!

Y la pregunta principal es: ¿cómo pudieron haber llegado allí en primer lugar, con la restricción única ya en su lugar?

Esquema:

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

Consulta de muestra: (pero este no es el único duplicado)

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 | +-------+----------+-------------------+-------------+

Y si intento una consulta de tabla alternativa en algún campo como:

ALTER TABLE rest_service_mediafile MODIFY external_id varchar (255) NULL;

Obtendré el error de restricción: El error fue: (1062, "Entrada duplicada ''157165-2'' para la clave ''rest_service_mediafile_video_id_4a2efdd4_uniq''")

Además, si intento simplemente insertar un valor duplicado, ¡fallará correctamente! ¿Alguno de ustedes encontró un escenario en el que esto es posible en MySQL?