Eu tenho uma tabela enorme - 36 milhões de linhas - no SQLite3. Nesta tabela muito grande, existem duas colunas:
hash
- textod
- real
Algumas das linhas são duplicadas. Ou seja, ambos hash
e d
têm os mesmos valores. Se dois hashes forem idênticos, os valores de d
. No entanto, dois valores idênticos d
não implicam em dois valores idênticos hash
.
Quero excluir as linhas duplicadas. Não tenho uma coluna de chave primária.
Qual é a maneira mais rápida de fazer isso?
Respostas:
Você precisa encontrar uma maneira de distinguir as linhas. Com base em seu comentário, você pode usar a coluna especial rowid para isso.
Para excluir duplicatas, mantendo o menor
rowid
por(hash,d)
:fonte
sqlite> alter table dist add id integer primary key autoincrement; Error: Cannot add a PRIMARY KEY column
autoincrement
pensamento. Funciona se você omitir aprimary key
parte?sqlite> alter table dist add id integer autoincrement;
Error: near "autoincrement": syntax error
Edit: SQLite tem um tipo de pseudo coluna "rowid" que está automaticamente lá, eu poderia usar isso?delete from dist where rowid not in (select max(rowid) from dist group by hash);
Parece fazer o truque! Obrigado.Acho que o mais rápido seria usar o próprio banco de dados para isso: adicione uma nova tabela com as mesmas colunas, mas com as restrições adequadas (um índice exclusivo no par hash / real?), Itere através da tabela original e tente inserir registros a nova tabela, ignorando erros de violação de restrição (ou seja, continuar iterando quando as exceções forem levantadas).
Em seguida, exclua a tabela antiga e renomeie a nova para a antiga.
fonte
Se adicionar uma chave primária não for uma opção, uma abordagem seria armazenar as duplicatas DISTINCT em uma tabela temporária, excluir todos os registros duplicados da tabela existente e, em seguida, adicionar os registros de volta à tabela original da tabela temporária .
Por exemplo (escrito para SQL Server 2008, mas a técnica é a mesma para qualquer banco de dados):
Não tenho certeza se sqlite tem uma
ROW_NUMBER()
função de tipo, mas se tiver, você também pode tentar algumas das abordagens listadas aqui: Excluir registros duplicados de uma tabela SQL sem uma chave primáriafonte
delete <alias> from <table> <alias>
sintaxe