Quando o DBA (ou seja, nós mesmos) não coloca uma constraint (restrição) de valores únicos numa tabela, pode ser que sejam inseridas linhas com valores duplicados. Não dá para colocar um constraint nessa tabela depois que temos linhas duplicadas. É preciso remover essas linhas.
Para remover linhas duplicadas no SQLite use um comando como o seguinte:
DELETE FROM database
WHERE rowid NOT IN (
SELECT MIN(rowid)
FROM database
GROUP BY column1, column2
);
O SQLite tem uma coluna especial chamada ROWID
que identifica unicamente cada linha numa tabela.
O que o código faz é:
- Agrupa-se a tabela pelas colunas
column1
ecolumn2
aplicando a funçãoMIN()
sobre a colunaROWID
; - Então o comando
DELETE
apaga as linhas comROWIDs
que não estão contidas nessa consulta, ou seja, removemos tudo exceto osROWIDs
mínimos para cada valor único agrupado pelas colunascolumn1
ecolumn2
.
Links: