La suppression de doublons de lignes à partir de la base de données sqlite
J'ai une énorme table de 36 millions de lignes en SQLite3.
Dans cette très grande table, il y a deux colonnes
- de hachage texte
- d - réel
Cependant, certaines lignes sont des doublons. C'est à la fois de hachage et d ont les mêmes valeurs.
Aussi, si deux hachages sont identiques, de sorte que les valeurs de d, mais deux identiques ds n'implique pas deux identiques hachages
De toute façon, je veux supprimer les lignes en double. Je n'ai pas de colonne de clé primaire.
Quel est le moyen le plus rapide pour ce faire?
EDIT: delete from dist where rowid not in (select max(rowid) from dist group by hash);
Semble faire l'affaire.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'un moyen de distinguer les lignes. En fonction de votre commentaire, vous pouvez utiliser le colonne rowid pour que.
À supprimer les doublons en gardant le plus bas
rowid
par(hash,d)
:sqlite> alter table dist add id integer primary key autoincrement; Error: Cannot add a PRIMARY KEY column
autoincrement
cependant, ne fonctionnera pas si vous omettez leprimary key
partie?sqlite> alter table dist add id integer autoincrement;
Error: near "autoincrement": syntax error
Edit: SQLite ne avoir un "rowid" pseudo type de colonne truc qu'est automatiquement là, pourrais-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 très de base de données pour: ajoutez une nouvelle table avec les mêmes colonnes, mais avec des contraintes propres (un index unique sur la table de hachage/paire réelle?), parcourir la table d'origine et d'essayer d'insérer des enregistrements dans la table, en ignorant les erreurs de violation de contrainte (c'est à dire continuer itération exceptions).
Puis supprimer l'ancienne table et renommez le nouveau à l'ancien.
Si l'ajout d'une clé primaire n'est pas une option, alors une approche serait de stocker les copies DISTINCTES dans une table temporaire, supprimer toutes les copies des enregistrements de la table existante, puis ajouter les enregistrements dans la table d'origine de la table temp.
Par exemple (écrit pour SQL Server 2008, mais la technique est la même que pour toute base de données):
Je ne suis pas sûr si sqlite a un
ROW_NUMBER()
type de fonction, mais si elle le fait, vous pouvez également essayer certains des approches présentées ici: Supprimer les doublons d'une table SQL sans clé primairedelete <alias> from <table> <alias>
syntaxe si