2011-08-26 3 views
2

J'ai une table dans mon serveur MySql avec les colonnes suivantes: ID (int, key), type (int), name (varchar).MySql - supprimer les duplications de la table

En raison d'une erreur dans mon application, des entrées en double ont été insérées dans la base de données, je veux supprimer ces entrées de sorte que chaque paire de noms ne comporte qu'une seule ligne.

des idées sur la façon de faire cela?

+0

duplication possible de [Quelle est la meilleure façon de dédupliquer une table?] (Http://stackoverflow.com/questions/2230295/whats-the-best-way-to-dedupe-a-table) –

Répondre

0

évidemment changer cette requête à une instruction select d'abord pour assurer les enregistrements corrects sont sélectionnés pour la suppression:

delete from table as t1 
using table as t2 
where t1.type = t2.type and t1.name = t2.name and t1.id > t2.id 
+0

Syntaxe intéressante, "SUPPRIMER .. UTILISER". Je suppose que c'est spécifique à MySQL? –

+0

oui, voir doc: http://dev.mysql.com/doc/refman/5.0/fr/delete.html –

+0

J'ai essayé d'exécuter le script: 'supprimer de s_relations comme t1 en utilisant s_relations comme t2 où t2.source_persona_id = t1.source_persona_id et t2.relation_type = t1.relation_type et t2.message_id = t1.message_id et t2.target_object_id = t1.target_object_id et t1.id> t2.id', mais a obtenu l'erreur suivante: 'SQL Erreur: Vous avez une erreur dans votre syntaxe SQL; vérifier le manuel qui correspond à votre version du serveur MySQL pour la syntaxe à utiliser près de 'comme t1 en utilisant s_relations comme t2 où t2.source_persona_id = t1.source_persona_i' à la ligne 1' – Ran

1

Cela dépend de ce que vous voulez garder et ce que vous voulez supprimer. Puisque l'ID est une clé, je suppose qu'il n'y a pas d'ID en double, mais des paires type/nom en double. Voici donc une idée sur la façon de les supprimer:

delete from my_table t1 
where exists (select 1 
       from my_table t2 
       where t2.type = t1.type 
       and t2.name = t1.name 
       and t2.id < t1.id) 

qui gardera le « double » avec le plus bas ID

    and t2.id > t1.id 

qui maintiendrait le « double » avec le plus grand ID

+0

Vous avez la même direction sur la condition deux fois, ce qui sauvera le plus petit 'id'. –

+0

Oups, merci! –

+0

j'ai essayé de courir ce qui suit: supprimer s_relations t1 où existe (sélectionnez 1 de s_relations t2 où t2.source_persona_id = t1.source_persona_id et t2.relation_type = t1.relation_type et t2.message_id = t1. message_id et t2.target_object_id = t1.target_object_id et t1.id> t2.id) 'mais a l'erreur suivante:' Erreur SQL: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 't1 où existe (sélectionnez 1 de s_relations t2 ' à la ligne 1' – Ran

0

Vous devez sélectionner distinct dans une nouvelle table, puis supprimer l'ancienne table et renommer la nouvelle table. Mais il y a beaucoup de façons de réaliser ce but:

What's the best way to dedupe a table?

+0

Nice lien, ce sont quelques techniques intéressantes –

Questions connexes