Tengo una tabla enorme, 36 millones de filas, en SQLite3. En esta tabla muy grande, hay dos columnas:
hash
- textod
- real
Algunas de las filas están duplicadas. Es decir, ambos hash
y d
tienen los mismos valores. Si dos hashes son idénticos, también lo son los valores de d
. Sin embargo, dos idénticos d
no implica dos idénticos hash
.
Quiero eliminar las filas duplicadas. No tengo una columna de clave principal.
¿Cuál es la forma más rápida de hacer esto?
Respuestas:
Necesita una forma de distinguir las filas. Según su comentario, podría usar la columna de identificador de fila especial para eso.
Para eliminar duplicados manteniendo el más bajo
rowid
por(hash,d)
:fuente
sqlite> alter table dist add id integer primary key autoincrement; Error: Cannot add a PRIMARY KEY column
autoincrement
aunque, ¿funciona si omite laprimary key
parte?sqlite> alter table dist add id integer autoincrement;
Error: near "autoincrement": syntax error
Editar: SQLite tiene un tipo de pseudo columna "rowid" que está automáticamente allí, ¿podría usar esto?delete from dist where rowid not in (select max(rowid) from dist group by hash);
¡Parece hacer el truco! Gracias.Supongo que lo más rápido sería usar la base de datos misma: agregue una nueva tabla con las mismas columnas, pero con las restricciones adecuadas (¿un índice único en hash / par real?), Iterar a través de la tabla original e intentar insertar registros en la nueva tabla, ignorando los errores de violación de restricciones (es decir, continuar iterando cuando se generen excepciones).
Luego elimine la tabla anterior y cambie el nombre de la nueva por la anterior.
fuente
Si agregar una clave principal no es una opción, entonces un enfoque sería almacenar los duplicados DISTINCT en una tabla temporal, eliminar todos los registros duplicados de la tabla existente y luego agregar los registros nuevamente a la tabla original desde la tabla temporal .
Por ejemplo (escrito para SQL Server 2008, pero la técnica es la misma para cualquier base de datos):
No estoy seguro de si sqlite tiene una
ROW_NUMBER()
función de tipo, pero si la tiene, también puede probar algunos de los enfoques enumerados aquí: Elimine registros duplicados de una tabla SQL sin una clave principalfuente
delete <alias> from <table> <alias>
sintaxis