Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 16/05/2011, 14h24   #1
Invité de passage
 
Femme audrey
Webmaster
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme audrey
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Par défaut PB de doublons avec ON DUPLICATE KEY UPDATE

Bonjour,
alors voilà, j'ai 2 tables qui se trouvent dans 2 bases différentes.

La 1ere table contient un certains nombres de champs, dont 3 que je veux recopier dans la seconde table qui elle est prévue juste pour ces 3 champs.

Comme je veux que la seconde table puisse être mise à jour selon les entrées de la 1ere, j'en suis arrivée à la requête ci-dessous (après une longue prise de tête).

Le hic c'est que au lieu d'écraser les anciennes valeurs avec les nouvelles, les lignes sont répétées (les nouvelles lignes contiennent quand même les nouvelles données, oufff j'ai pas tout perdu), il y'a environ 1400 enregistrements, si à chaque passage j'en rajoute autant ça va vite être énorme et surtout n'importe quoi.

Bref je pense que j'ai fais une erreur ou omis quelque chose dans ma requête, mais quoi ???

si quelqu'un avait une idée, une solution, un zorro des requêtes...

Code php :
1
2
3
4
5
6
$strSQL = $sql = "INSERT INTO racingw_inscrip.recup_pseudo_forum (user_id, username, user_email)
(SELECT racingw_forum.php3_users.user_id, racingw_forum.php3_users.username, racingw_forum.php3_users.user_email
FROM racingw_forum.php3_users) 
ON DUPLICATE KEY UPDATE
racingw_inscrip.recup_pseudo_forum.user_id = racingw_forum.php3_users.user_id";
$resultat = requete_SQL($strSQL);

Merci d'avance
Audrey
Seeker35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 14h33   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Hé bien tout dépend de ce qui est déclaré comme PRIMARY KEY dans la table racingw_inscrip.recup_pseudo_forum.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 14h36   #3
Invité de passage
 
Femme audrey
Webmaster
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme audrey
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
j'ai mis une clé primaire sur user_id de la table racingw_inscrip.recup_pseudo_forum,
d’ailleurs j'ai aussi essayé de mettre unique sur ce même champ, dans ce cas je n'avais plus de doublons, mais plus de mise à jour non plus
Seeker35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 14h50   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Si user_id est PRIMARY KEY la clause ON DUPLICATE KEY tenterait de violer cette contrainte, ce qui n'est pas souhaitable et, normalement, pas possible.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 15h09   #5
Invité de passage
 
Femme audrey
Webmaster
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme audrey
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
j'ai essayé une nouvelle idée qui me paraissait un peu farfelue mais bon ... à ce stade je tente tout ce qui me passe par la tête.
j'ai donc modifié ma table pour mettre UNIQUE sur le champ user_id au lieu de PRIMARY KEY
j'ai également modifié ma requête:

Code php :
1
2
3
4
5
6
7
8
$strSQL = $sql = "INSERT INTO racingw_inscrip.recup_pseudo_forum (user_id, username, user_email) 
(SELECT racingw_forum.php3_users.user_id, racingw_forum.php3_users.username, racingw_forum.php3_users.user_email 
FROM racingw_forum.php3_users) 
ON DUPLICATE KEY UPDATE
racingw_inscrip.recup_pseudo_forum.user_id = racingw_forum.php3_users.user_id, 
racingw_inscrip.recup_pseudo_forum.username = racingw_forum.php3_users.username, 
racingw_inscrip.recup_pseudo_forum.user_email = racingw_forum.php3_users.user_email";
$resultat = requete_SQL($strSQL);

du coup là ça fonctionne bien comme je veux, les nouvelles entrées sont insérées, les anciennes mises à jour, par contre je me demande si c'est bien joli, joli de mettre UNIQUE sans le PRIMARY KEY (je suis novice et dans ma petite tête il était impératif que le PRIMARY KEY soit sur l'identifiant), non ?
Seeker35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 15h31   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
En fait, PRIMARY KEY est nécessaire et suffisant.
La clause ON DUPLICATE KEY UPDATE n'a pas à s'occuper de la colonne PRIMARY KEY mais uniquement de ce qui doit être fait pour les autres colonnes.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 15h47   #7
Invité de passage
 
Femme audrey
Webmaster
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Femme audrey
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
ça y est j'y suis !!!!
je viens de comprendre, en fait dans ma requête au départ j'avais mis la clause on duplicate sur le champ qui avait la clé primaire

j'ai donc remodifié tout ça en mettant la clé primaire sur le champ user_id

et dans la requête je précise à on duplicate d'agir sur les 2 autre champs

Code :
1
2
3
ON DUPLICATE KEY UPDATE
racingw_inscrip.recup_pseudo_forum.username = racingw_forum.php3_users.username,
racingw_inscrip.recup_pseudo_forum.user_email = racingw_forum.php3_users.user_email
et ça marche tout bien
merci beaucoup
Seeker35 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 12h05.


 
 
 
 
Partenaires

Hébergement Web