2011-09-29 3 views
1

J'ai 2 tables. Les tables de villes ne sont pas normalisées car les informations sur le pays sont en texte brut. J'ai ajouté l'id_country à la table 'city' (cette colonne est vide).Normaliser la table MySQL avec les enregistrements d'une autre table

Je dois vérifier les correspondances entre ville> pays et pays> pays puis mettre à jour les dossiers de la ville qui correspondent à la id_country de la table du pays. À la fin, je serai en mesure de supprimer la colonne «pays» de la table de la ville.

table Ville

  • id_city (1, 2, 3 ...)
  • ville (Washington, Guayaquil, Bonn ...)
  • pays (Allemagne, Equateur, Etats-Unis. ..)
  • id_country (vide)

table Pays

  • id_country (1, 2, 3 ...)
  • Code
  • (GE, CE, États-Unis ...)
  • pays (Allemagne, Equateur, Etats-Unis ...)

Je n'ai aucune idée sur où commencer et si cela peut être fait avec une requête SQL. Mon idée originale était de rechercher des correspondances dans une boucle php mais cela semble être une implémentation vraiment plus difficile.

Répondre

1

Vous pouvez le faire avec un JOIN sur une instruction UPDATE.

UPDATE city c1 INNER JOIN country c2 ON c1.country=c2.country 
SET c1.id_country=c2.id_country; 

L'utilisation d'un INNER JOIN fera en sorte que les mises à jour se produisent uniquement pour les villes qui ont une valeur de pays correspondant. Une fois que vous l'avez exécuté, vous pourrez sélectionner toutes les villes qui ont encore un id_country nul au cas où certaines d'entre elles ne correspondraient pas. Inversement, une fois que vous avez déterminé que toutes vos villes ont un id_country, vous pouvez supprimer cette colonne de la table de ville.

+0

Terminé! 3500 dossiers, 81 où sans pays. Tu m'as sauvé beaucoup de temps. Merci! – andufo

0

Quelque chose comme cela devrait fonctionner:

UPDATE city set id_country = (SELECT country.id_country from country WHERE country.country = city.country) 
1

Les tables de villes ne sont pas normalisées car les informations de pays sont en texte brut.

Non-sens. La normalisation ne signifie pas «remplacer le texte brut par des numéros d'identification». Trouvez celui qui vous l'a appris et piquez-le dans les yeux avec un bâton acéré.

Votre vrai problème est que «ville» plus «pays» n'est pas suffisant pour identifier les villes, au moins aux États-Unis. Je pense qu'il y a au moins une douzaine de villes différentes nommées "Washington" aux Etats-Unis.

Au lieu de remplacer le nom du pays avec un numéro d'identification, vous seriez bien mieux le remplacer par le code de pays à deux lettres.Les codes sont lisibles par l'homme; les numéros d'identification nécessiteront un JOIN supplémentaire dans chaque requête qui utilise votre table de villes.

+0

pas tout à fait. ce n'est pas une table "ville" en soi, j'ai changé le nom de la table pour éviter les confusions. c'est une table d'aéroports, où chaque aéroport est sur une ville spécifique. l'id_country est pour placer le drapeau du pays seulement. – andufo

+0

"J'ai changé le nom de la table pour éviter les confusions." Ah. Si seulement ça avait marché. ;) –

+0

cela a fonctionné pour zombat. – andufo

Questions connexes