2011-09-07 20 views
8

Tengo 511 duplicados en mi tabla, necesito eliminarlos, pero no los originales. Por lo tanto, quiero eliminar cada segunda aparición de cada duplicado.MYSQL Eliminar PRIMER duplicados de la tabla

¿Cómo puedo hacer esto?

tabla:

code/ status/ time 
E3F4FF928A/0/
07D95444BB/0/ 
07D95444BB/ 0/
40006C128F/0/1315293012 
2B45790E52 /0/
40006C128F/0/1315293012 
+0

publique la definición de su tabla. –

+1

¿Son duplicados exactos, o tiene una clave única en alguna parte? – Jason

+1

Un verdadero duplicado es la copia exacta del original. ¿Realmente tiene duplicados, o tiene filas donde muchos de los datos son idénticos, pero algo como la columna de autoinc o la fecha de creación son diferentes? – Zak

Respuesta

8

agregar un índice único a la tabla en la columna que debe ser único, e ignoran los errores

alter ignore table X add unique index (column_a) 

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

+0

No se dirige * Quiero eliminar cada segunda ocurrencia de cada duplicado. * –

+0

sí esto no logra el resultado deseado . –

+1

sé más específico ... tienes a b a b c b a .. ¿Quieres una b c o quieres una b c b a? – Zak

0
DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
     (t1.somefield = t2.somefield 
    AND t1.otherfield = t2.otherfield /*add more fields if need be */ 
    AND t2.id > t1.id) 
LEFT JOIN table1 t3 ON 
     (t1.somefield = t3.somefield 
    AND t1.otherfield = t3.otherfield /*add more fields if need be */ 
    AND t3.id > t2.id) 
WHERE (t3.id IS NULL) 
ORDER BY t2.id ASC 

Esto sólo debe eliminar el segundo duplicado y deja el tercero y más allá de los duplicados solo.

si quieres algo menos esotérica, y tiene una columna de marca de tiempo, tal vez usted quiere hacer

DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
     (t1.somefield = t2.somefield 
    AND t1.otherfield = t2.otherfield /*add more fields if need be */ 
    AND t2.`timestamp` > t1.`timestamp`) 
WHERE (1=1)  /*In some mode(s) MySQL requires a where clause with delete*/ 
ORDER BY t2.id ASC 
1

Sólo tiene que ejecutar en este problema hoy en día (sin clave única de la tabla).

Lo resuelto como esto

DELETE FROM table where code=x and status=y and time=z LIMIT 1; 

Esto eliminará la primera fila 1 de los criterios dados (si tiene n duplicados, puesto n-1 para mantener sólo uno).

+0

no responde la pregunta – chuse

Cuestiones relacionadas