J'ai une énorme table - 36 millions de lignes - dans SQLite3. Dans ce très grand tableau, il y a deux colonnes:
hash
- texted
- réel
Certaines des lignes sont des doublons. Autrement dit, les deux hash
et d
ont les mêmes valeurs. Si deux hachages sont identiques, les valeurs de d
. Cependant, deux identiques d
n'impliquent pas deux identiques hash
.
Je souhaite supprimer les lignes en double. Je n'ai pas de colonne de clé primaire.
Quel est le moyen le plus rapide de le faire?
Réponses:
Vous avez besoin d'un moyen de distinguer les lignes. En fonction de votre commentaire, vous pouvez utiliser la colonne rowid spéciale pour cela.
Pour supprimer les doublons en conservant le plus bas
rowid
par(hash,d)
:la source
sqlite> alter table dist add id integer primary key autoincrement; Error: Cannot add a PRIMARY KEY column
autoincrement
bonne, est-ce que cela fonctionne si vous omettez laprimary key
pièce?sqlite> alter table dist add id integer autoincrement;
Error: near "autoincrement": syntax error
Edit: SQLite a un truc de type pseudo-colonne "rowid" qui est automatiquement là, puis-je l'utiliser?delete from dist where rowid not in (select max(rowid) from dist group by hash);
Semble faire l'affaire! Merci.Je suppose que le plus rapide serait d'utiliser la base de données même pour cela: ajoutez une nouvelle table avec les mêmes colonnes, mais avec des contraintes appropriées (un index unique sur le hachage / paire réelle?), Parcourez la table d'origine et essayez d'insérer des enregistrements dans la nouvelle table, en ignorant les erreurs de violation de contrainte (c'est-à-dire continuer à itérer lorsque des exceptions sont déclenchées).
Supprimez ensuite l'ancienne table et renommez la nouvelle par l'ancienne.
la source
Si l'ajout d'une clé primaire n'est pas une option, une approche serait de stocker les doublons DISTINCT dans une table temporaire, de supprimer tous les enregistrements dupliqués de la table existante, puis de rajouter les enregistrements dans la table d'origine à partir de la table temporaire .
Par exemple (écrit pour SQL Server 2008, mais la technique est la même pour n'importe quelle base de données):
Je ne sais pas si sqlite a une
ROW_NUMBER()
fonction de type, mais si c'est le cas, vous pouvez également essayer certaines des approches répertoriées ici: Supprimer les enregistrements en double d'une table SQL sans clé primairela source
delete <alias> from <table> <alias>