Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/11/2010, 14h41   #1
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 11
Points : 11
Par défaut Pb avec un UPDATE bête et méchant

Bonjour,

J'ai une table t1 de 30 champs et environ 2 millions de lignes et je me suis aperçu d'une erreur de calcul dans un des champs, champ f1 par exemple.
J'ai corrigé le calcul et j'ai maintenant un fichier avec les nouvelles valeurs (l'ordre des lignes est conservé).

Avec LOAD DATA INFILE, j'ai copié mes nouvelles valeurs dans le champ f2 d'une table temporaire t2.

Je voudrais "juste" remplacer les mauvaises valeurs par les bonnes sans conditions sans rien, c'est-à-dire faire un truc du style
Code :
1
2
 
UPDATE t1,t2 SET t1.f1=t2.f2;
J'ai d'abord essayé sur des petites tables, mais sans succès (ça ne recopie que la première ligne de t2.f2 dans tout le champ t1.f1).

Est-ce que vous auriez une idée ?
Et petite question subsidiaire : est-ce que ça va prendre du temps pour 2 millions de lignes ?

Merci par avance pour votre aide,
Ptit Bleu.
ptit_bleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h05   #2
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
et avec un where ? (sans aucune conviction).

Code :
UPDATE t1,t2 SET t1.f1=t2.f2 WHERE t1.f1=t2.f2
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h13   #3
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 11
Points : 11
Bonjour Maysa et merci pour ta réponse.

Mais je n'ai pas de where à mettre.
Dans mon cas t1.f1 est différent de t2.f2 puisque j'aimerais remplacer l'un par l'autre.

Et un where sur 2 millions de lignes, ça doit durer, non ?

Une autre idée ?
Merci par avance,
Ptit Bleu.
ptit_bleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h18   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 956
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 956
Points : 18 161
Points : 18 161
Envoyer un message via MSN à CinePhil
Il faut mettre une condition de jointure sur la ou les colonnes qui forme(nt) la clé primaire de la table :
Code :
1
2
3
UPDATE t1
INNER JOIN t2 ON t1.cle_primaire = t2.cle_primaire
SET t1.f1 = t2.f2
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h06   #5
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 11
Points : 11
Comme j'avais vérifié que l'ordre des lignes était conservé, je n'ai créé qu'un vecteur avec les nouvelles valeurs.
Je n'ai donc pas de champ pour faire le lien entre les deux tables (t2 ne possède que le champ f2).

Si j'ai bien compris, il faut que je retraite mes données en ajoutant un champ commun entre les deux tables (clé primaire obligatoire ou juste un champ commun ?)

Et pour le temps d'exécution, une idée (heure, jour, ...) ?

Merci pour les confirmations,
Bonne fin de journée,
Ptit Bleu.
ptit_bleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h09   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 956
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 956
Points : 18 161
Points : 18 161
Envoyer un message via MSN à CinePhil
Ta table t1 n'a pas de clé primaire ?

Il faut que tu détermine dans t1 et dans t2 l'ensemble de colonnes qui vont permettre de déterminer de manière unique chaque ligne pour les faire correspondre en condition de jointure.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h14   #7
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 11
Points : 11
Euh ben non.
C'était prévu en utilisant un n° de mesure unique mais il y a eu un souci etj'ai parfois 2 n° identiques.
Le seul champ unique c'est l'heure de la mesure stockée comme une chaine de caractère du type "2010-11-24 17:12:00".
Mais ce servir de ça comme clé primaire, ça risque de ne pas être efficace, non ?

Désolé pour ces questions de base mais il faut vraiment que je remette à jour la base dès que possible.
Encore merci pour votre aide,
Ptit Bleu.
ptit_bleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h27   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 956
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 956
Points : 18 161
Points : 18 161
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par ptit_bleu Voir le message
Le seul champ unique c'est l'heure de la mesure stockée comme une chaine de caractère du type "2010-11-24 17:12:00".
Mais ce servir de ça comme clé primaire, ça risque de ne pas être efficace, non ?
Je suppose que c'est une opération que tu ne vas pas répéter ?

Alors indexe cette colonne dans la table t1 et dans la table 2 et fais une jointure dessus dans ton UPDATE.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 09h49   #9
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 11
Points : 11
Et si je rajoute une colonne en fin de table dans chaque table qui donne le n° de la ligne auto-incrémenté qui pourrait servir de clé primaire. Et ça pourrait servir si jamais un nouveau problème de ce genre arrivait.

C'est mieux ou pas ?

Si oui, comment créer cette colonne mais en fin de table pour ne gêner le programme qui inscrit les données dans la table t1 ?

Je sens qu'on approche d'une solution :-)
Encore un dernier effort !
Merci encore pour votre aide,
Ptit Bleu.
ptit_bleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 09h59   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 956
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 956
Points : 18 161
Points : 18 161
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par ptit_bleu Voir le message
Et si je rajoute une colonne en fin de table dans chaque table qui donne le n° de la ligne auto-incrémenté qui pourrait servir de clé primaire. Et ça pourrait servir si jamais un nouveau problème de ce genre arrivait.

C'est mieux ou pas ?
Oui c'est aussi une solution si tu es sûr que les lignes générées dans le fichier à importer arriveront dans le même ordre.

Citation:
Si oui, comment créer cette colonne mais en fin de table pour ne gêner le programme qui inscrit les données dans la table t1 ?
Ben si tu ajoutes une colonne, elle vient en dernière position non ?
Par contre la fin de ta phrase me laisse à penser que la requête INSERT de ton programme ne précise pas les noms de colonnes à alimenter, ce qui n'est pas bien !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 13h51   #11
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 11
Points : 11
Pour répondre à ta remarque
Citation:
Par contre la fin de ta phrase me laisse à penser que la requête INSERT de ton programme ne précise pas les noms de colonnes à alimenter, ce qui n'est pas bien !
, mon programme crée un tableau dont l'ordre des colonnes tient compte de l'ordre des champs dans la table MySQL.
Ensuite je copie tout le tableau et pas un champ après l'autre.

Je vais essayer de rajouter une colonne dans mes tables de test et appliquer ta requête :
Code :
1
2
3
UPDATE t1
INNER JOIN t2 ON t1.cle_primaire = t2.cle_primaire
SET t1.f1 = t2.f2
Mettez un cierge pour moi.
Je mets "Résolu" (trop optimiste ?) par avance.
Merci pour votre aide (en particulier merci à Cinephil),
Ptit Bleu.

PS : je viens de finir. Ca a marché !!!
Mais j'ai dû le faire en 2 temps : d'abord ajouter une nouvelle colonne et dans un deuxième temps la déclarer comme clé primaire. Lorsque je faisais tout en une seule requête, la colonne était mise en premier, ce que je ne voulais pas.
Bon week-end.
ptit_bleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h14.


 
 
 
 
Partenaires

Hébergement Web