Dans un tableau, j'ai trois colonnes - identifiant, nom et nombre. Un bon nombre de colonnes de noms sont identiques (en raison de l'absence d'UNIQUE au début) et je veux corriger cela. Cependant, la colonne id est utilisée par d'autres (4 ou 5, je pense - je devrais vérifier les docs) des tables pour chercher le nom et juste les enlever casserait des choses. Donc, y a-t-il une bonne façon de dire «trouver tous les documents identiques et les fusionner»?Existe-t-il un moyen propre de nettoyer les entrées en double dans MySQL?
2
A
Répondre
4
Ce genre de question est de temps en temps. Non, il n'y a pas une façon vraiment propre de le faire. Vous devez modifier toutes les lignes de la table enfant qui dépendent des valeurs indésirables dans la table parent avant de pouvoir éliminer les lignes indésirables dans la table parent.
MySQL prend en charge les multi-tables UPDATE
et DELETE
déclarations (contrairement à d'autres marques de base de données) et de sorte que vous pouvez faire quelques trucs assez soignées comme les suivantes:
UPDATE names n1
JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name)
JOIN child_table c ON (n2.id = c.id)
SET c.name_id = n1.id
ORDER BY n1.id DESC;
Une fois que vous avez fait cela sur toute la table enfant (s), vous pouvez utiliser la syntaxe multi-table DELETE
de MySQL pour supprimer les lignes indésirables dans la table parente:
DELETE FROM n2
USING names n1 JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name);
0
Pourquoi ne pouvez-vous faire quelque chose comme
update dependent_table set name_id = <id you want to keep> where name_id in (
select id from names where name = 'foo' and id != <id you want to keep>)