MySQL: ALTER IGNORE TABLE da “Violación de restricción de integridad”

Estoy tratando de eliminar duplicados de una tabla MySQL usando ALTER IGNORE TABLE + una KEY ÚNICA. La documentación de MySQL dice:

IGNORE es una extensión de MySQL para SQL estándar. Controla cómo funciona ALTER TABLE si hay duplicados en claves únicas en la nueva tabla o si se producen advertencias cuando se habilita el modo estricto. Si no se especifica IGNORE, la copia se cancela y se retrotrae si se producen errores de clave duplicada. Si se especifica IGNORE, solo se usa la primera fila de filas con duplicados en una clave única. Las otras filas conflictivas se eliminan. Los valores incorrectos se truncan al valor aceptable de coincidencia más cercano.

Cuando ejecuto la consulta …

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field) 

… Todavía recibo el error # 1062 – Entrada duplicada ‘blabla’ para la clave ‘dupidx’ .

La extensión de IGNORE clave IGNORE a MySQL parece tener un error en la versión InnoDB en alguna versión de MySQL.

Siempre puedes convertir a MyISAM, IGNORE-ADD el índice y luego convertir de nuevo a InnoDB

 ALTER TABLE table ENGINE MyISAM; ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field); ALTER TABLE table ENGINE InnoDB; 

Tenga en cuenta que si tiene restricciones de clave externa, esto no funcionará, deberá eliminarlas primero y volverlas a agregar más tarde.

O intente establecer sesión old_alter_table = 1 (¡No olvide volver a configurarlo!)

Ver: http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/

El problema es que tiene datos duplicados en el campo que intenta indexar. Tendrá que eliminar los duplicados ofensivos antes de poder agregar un índice único.

Una forma es hacer lo siguiente:

  CREATE TABLE tmp_table LIKE table; ALTER IGNORE TABLE tmp_table ADD UNIQUE INDEX dupidx (field); INSERT IGNORE INTO tmp_table SELECT * FROM table; DROP TABLE table; RENAME TABLE tmp_table TO table; 

esto le permite insertar solo los datos únicos en la tabla