Necesito DELETE
filas duplicadas para el sid especificado en una MySQL
tabla.
¿Cómo puedo hacer esto con una consulta SQL?
DELETE (DUPLICATED TITLES) FROM table WHERE SID = "1"
Algo así, pero no sé cómo hacerlo.
mysql
duplicates
Ali Demirci
fuente
fuente
Respuestas:
esto elimina duplicados en su lugar, sin hacer una nueva tabla
nota: solo funciona bien si el índice cabe en la memoria
fuente
ALTER IGNORE
.ALTER TABLE foo ENGINE MyISAM
para evitarlo, volví a cambiar el motor.Supongamos que tiene una tabla
employee
, con las siguientes columnas:Para eliminar las filas con una
first_name
columna duplicada :fuente
employee
contra sí mismo para una coincidencia de índice y una>
verificación en un índice será lenta para tablas grandes. ¿No sería mejorSELECT MAX(ID) FROM t GROUP BY unique
y luegoJOIN
a una coincidencia exacta deID
aMAX(ID)
?Después de eliminar duplicados para todos los SID-s, no solo uno solo.
Con mesa de temperatura
Como
temp_table
está recién creado, no tiene índices. Deberá volver a crearlos después de eliminar los duplicados. Puede verificar qué índices tiene en la tabla conSHOW INDEXES IN table
Sin tabla temporal:
fuente
SELECT * FROM table GROUP BY title, SID;
Todo depende de qué tan bien sepa lo que está haciendo.Eliminar filas duplicadas en MySQL in situ, (suponiendo que tenga una columna de marca de tiempo para ordenar) tutorial:
Crea la tabla e inserta algunas filas:
Eliminar los duplicados en su lugar:
Ya ha terminado, se eliminan las filas duplicadas, se guarda la última por marca de tiempo.
Para aquellos de ustedes sin una marca de tiempo o una columna única.
¿No tiene una
timestamp
o una columna de índice única para ordenar? Estás viviendo en un estado de degeneración. Tendrá que realizar pasos adicionales para eliminar filas duplicadas.crea la tabla de pingüinos y agrega algunas filas
haga un clon de la primera tabla y cópiela.
El agregado máximo opera sobre el nuevo índice moo:
observar y limpiar
¿Qué está haciendo esa gran declaración de eliminación de SQL?
Los pingüinos de mesa con el alias 'a' se unen en un subconjunto de pingüinos de mesa llamado alias 'b'. La tabla de la derecha 'b', que es un subconjunto, encuentra la marca de tiempo máxima [o max moo] agrupada por columnas foo y bar. Esto coincide con la tabla de la izquierda 'a'. (foo, bar, baz) a la izquierda tiene cada fila en la tabla. El subconjunto de la derecha 'b' tiene un (maxtimestamp, foo, bar) que coincide con el izquierdo solo en el que ES el máximo.
Cada fila que no es ese máximo tiene el valor maxtimestamp de NULL. Filtra hacia abajo en esas filas NULL y tienes un conjunto de todas las filas agrupadas por foo y bar que no es el último baz de marca de tiempo. Eliminar esos.
Haga una copia de seguridad de la tabla antes de ejecutar esto.
Evite que este problema vuelva a ocurrir en esta tabla:
Si conseguiste que esto funcione, y apagó tu fuego de "fila duplicada". Excelente. Ahora defina una nueva clave compuesta única en su tabla (en esas dos columnas) para evitar que se agreguen más duplicados en primer lugar.
Al igual que un buen sistema inmunitario, las filas malas ni siquiera deberían permitirse en la mesa en el momento de la inserción. Más tarde, todos los programas que agreguen duplicados transmitirán su protesta, y cuando los arregles, este problema nunca volverá a aparecer.
fuente
ID
columna de incremento automático , entonces laON
cláusula solo debe coincidir con laID
columna, nada más.Después de encontrarme con este problema, en una gran base de datos, no estaba completamente impresionado con el rendimiento de ninguna de las otras respuestas. Quiero mantener solo la última fila duplicada y eliminar el resto.
En una declaración de una consulta, sin una tabla temporal, esto funcionó mejor para mí,
La única advertencia es que tengo que ejecutar la consulta varias veces, pero incluso con eso, encontré que funcionó mejor para mí que las otras opciones.
fuente
Esto siempre parece funcionar para mí:
Que mantiene la ID más baja en cada uno de los duplicados y el resto de los registros no duplicados.
También he hecho lo siguiente para que el problema de engaño ya no ocurra después de la eliminación:
En otras palabras, creo un duplicado de la primera tabla, agrego un índice único en los campos de los que no quiero duplicados y luego hago uno
Insert IGNORE
que tiene la ventaja de no fallar como loInsert
haría normalmente la primera vez que intentó agregar un registro duplicado basado en los dos campos e ignora dichos registros.Al mover fwd se hace imposible crear registros duplicados basados en esos dos campos.
fuente
ORDER BY
en elSELECT
para estar seguro de qué registro realmente pasa alNoDupeTable
?ORDER by ID Asc
, no podría doler, así que editaré mi respuesta de todos modos.Select Max(ID)
luego,Order by Max(ID)
pero todo lo que haría sería invertir el orden de la inserción. Para obtener la ID más alta requeriría Creo que una selección select más compleja ya que, independientemente de cómo ordene arriba, tomará los valores de campo de la ID más baja.MAX(ID)
oMIN(ID)
y nombres de columna en lugar de*
en elSELECT FROM DupeTable
de que, de lo contrario vas a tener uno de losID
's al azar. De hecho, muchos SQL e incluso MySQL estrictos requieren llamar a una función agregada en cada columna no especificada en laGROUP BY
cláusula.ID,First,Last,Notes
y registros1,Bob,Smith,NULL
y2,Bob,Smith,Arrears
luego hacer unSELECT *Max(ID), First,Last,Notes FROM DupeTable group by First,Last
, ambos devolverían el mismo registro, 1, excepto con una ID diferente. Max (ID) volvería2,Bob,Smith,NULL
y Min (ID) volvería1,Bob,Smith,NULL
. Para obtener el segundo registro con 'Atrasos' en las notas se requiere una unión, creo.Lo siguiente funciona para todas las tablas
fuente
Aquí hay una respuesta simple:
fuente
and a.id_field = b.id
LEFT JOIN
tob
solo necesita compararb.id
=a.id_field
suponiendo quefield_id
es un ID de incremento automático único. entoncesa.field_being_repeated = b.field_being_repeated
es extraño. (b.id_field
tampoco existe en esta consulta esb.id
.Este trabajo para mí para eliminar registros antiguos:
Puede reemplazar min (e.id) a max (e.id) para eliminar los registros más recientes.
fuente
fuente
Creo que la solución de Werner anterior es la más conveniente porque funciona independientemente de la presencia de una clave principal, no se mete con las tablas, usa sql a prueba de futuro, es muy comprensible.
Como dije en mi comentario, esa solución no se ha explicado correctamente. Entonces esto es mío, basado en eso.
1) agregar una nueva columna booleana
2) agregue una restricción en las columnas duplicadas Y la nueva columna
3) establece la columna booleana en verdadero. Esto tendrá éxito solo en una de las filas duplicadas debido a la nueva restricción
4) eliminar filas que no se han marcado como mantenimiento
5) suelte la columna agregada
Le sugiero que mantenga la restricción que agregó, para evitar nuevos duplicados en el futuro.
fuente
Este procedimiento eliminará todos los duplicados (incluidos los múltiplos) en una tabla, manteniendo el último duplicado. Esta es una extensión de Recuperar el último registro en cada grupo
Espero que sea útil para alguien.
fuente
Otra forma fácil ... usando ACTUALIZAR IGNORE:
U tiene que usar un índice en una o más columnas (tipo índice). Cree una nueva columna de referencia temporal (que no forme parte del índice). En esta columna, marca los exclusivos actualizándolos con la cláusula ignorar. Paso a paso:
Agregue una columna de referencia temporal para marcar los únicos:
=> esto agregará una columna a su tabla.
Actualice la tabla, intente marcar todo como único, pero ignore los posibles errores debido a un problema clave duplicado (se omitirán los registros):
=> encontrará que sus registros duplicados no se marcarán como únicos = 'Sí', en otras palabras, solo uno de cada conjunto de registros duplicados se marcará como único.
Elimina todo lo que no sea único:
=> Esto eliminará todos los registros duplicados.
Suelta la columna ...
fuente
unique
columna DEBE agregarse a una restricción única junto con las columnas que están duplicadas actualmente, de lo contrario, todo no funciona porque SETunique
= 'Sí' nunca fallará.unique
es una palabra clave mysql. Por lo tanto, debe tener los backticks (como ya se muestra correctamente). Usar otra palabra para la columna podría ser más conveniente.Eliminar duplicados en tablas MySQL es un problema común, que generalmente viene con necesidades específicas. En caso de que alguien esté interesado, aquí ( Eliminar filas duplicadas en MySQL ) explico cómo usar una tabla temporal para eliminar duplicados de MySQL de manera confiable y rápida, también válida para manejar grandes fuentes de datos (con ejemplos para diferentes casos de uso).
Ali , en tu caso, puedes ejecutar algo como esto:
fuente
fuente
Me encanta la respuesta de @ eric, pero parece que no funciona si tienes una mesa realmente grande (la obtengo
The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay
cuando intento ejecutarla). Así que limité la consulta de combinación para considerar solo las filas duplicadas y terminé con:La cláusula WHERE en este caso permite que MySQL ignore cualquier fila que no tenga un duplicado y también ignorará si esta es la primera instancia del duplicado, por lo que solo se ignorarán los duplicados posteriores. Cambie
MIN(baz)
aMAX(baz)
para mantener la última instancia en lugar de la primera.fuente
Esto funciona para tablas grandes:
Para eliminar el cambio más antiguo
max(id)
amin(id)
fuente
Esto hará que la columna se convierta
column_name
en una clave principal y, mientras tanto, ignore todos los errores. Por lo tanto, eliminará las filas con un valor duplicado paracolumn_name
.fuente
Creo que esto funcionará básicamente copiando la tabla y vaciándola y luego volviendo a colocar solo los valores distintos, pero revísela antes de hacerlo en grandes cantidades de datos.
Crea una copia al carbón de tu mesa
Vacía tu mesa original
Copia todos los valores distintos de la tabla copiada a su tabla original
Elimina tu tabla temporal.
Necesita agrupar por todos los campos que desea mantener distintos.
fuente
fuente
así es como generalmente elimino los duplicados
fuente
Puede usar una cláusula DISTINCT para seleccionar la lista "limpiada" (y aquí hay un ejemplo muy sencillo sobre cómo hacerlo).
fuente
DISTINCT
usarlo, pierde toda la información sobre duplicados que podría haber tenido en primer lugar. ¿Puedes mostrar una forma de eliminar duplicados usándolo?¿Podría funcionar si los cuenta y luego agrega un límite a su consulta de eliminación dejando solo uno?
Por ejemplo, si tiene dos o más, escriba su consulta de esta manera:
fuente
Solo hay unos pocos pasos básicos al eliminar datos duplicados de su tabla:
Aquí está el tutorial completo: https://blog.teamsql.io/deleting-duplicate-data-3541485b3473
fuente