Page 1 sur 1

Souci avec ON DUPLICATE KEY UPDATE et auto_increment

Posté : 22 févr. 2007, 19:11
par piedbleu
Edit titre du post.

Bonjour,

Je transpire à grosses gouttes sur un pbm. d'insertion / maj. de données.

J'ai un formulaire qui me permet de saisir les références d'un article, sur une ligne et trois champs (nom, quantité et prix de l'article).

Insertion
Je peux enregistrer cette saisie, ou afficher autant de lignes vides supplémentaires que je veux, en effectuer les saisies et enregistrer le tout: c'est ok et correspond à la requête suivante, en bouclant sur le nbre de lignes:
INSERT INTO article (nom_art, qte, pu)
VALUES ('{$article[nom][$i]}','{$article[qte][$i]}','{$article[pu][$i]}')
Un auto_increment idarticle me sert de clé primaire; je le récupère pour l'étape suivante que voici:

Maj
Je rappelle mon formulaire et affiche les lignes précédemment saisies: c'est ok.
J'y ajoute des références article et là patatras: j'enregistre le tout et pas seulement ma mise à jour.
INSERT INTO article (nom_art, qte, pu)
VALUES ('{$article[nom][$j]}','{$article[qte][$j]}','{$article[pu][$j]}')
ON DUPLICATE KEY
UPDATE nom_art= '{$article[nom][$j]}', qte= '{$article[qte][$j]}', pu= '{$article[pu][$j]}'
ou en faisant apparaitre la clé primaire:
INSERT INTO article (idarticle, nom_art, qte, pu)

VALUES ('{article[id][$j]}','{$article[nom][$j]}','{$article[qte][$j]}','{$article[pu][$j]}')

ON DUPLICATE KEY

UPDATE nom_art= '{$article[nom][$j]}', qte= '{$article[qte][$j]}', pu= '{$article[pu][$j]}'
J'ai essayé une clause IGNORE mais même souci.

J'ai bien une méthode qui fonctionne mais que je veux éviter:
à chaque mise à jour, vider la table et la remplir à nouveau.

Donc pour résumer:
1er appel du formulaire,
je saisis nom1, qt1, pu1
et j'enregistre, idarticle=1 est généré.

2nd appel,
affichage de nom1, qte1, pu1
affichage ligne vide et saisie de nom2, qte2, pu2

et l'enregistrement est alors
1 nom1, qte1, pu1
2 nom1, qte1, pu1
3 nom2, qte2, pu2

au lieu de
1 nom1, qte1, pu1
2 nom2, qte2, pu2

Merci de vos remarques avisées !

Posté : 22 févr. 2007, 21:42
par piedbleu
En considérant la doc:


Si vous spécifiez la clause ON DUPLICATE KEY UPDATE (nouveau en MySQL 4.1.0), et qu'une ligne insérée engendre un doublon pour une clé PRIMARY ou UNIQUE, une commande UPDATE sera faite à la place de l'insertion.


alors il est normal que mes requêtes ne fonctionnent pas car les valeurs de ma clé primaire ne sont pas encore générées lors de ma mise à jour.
Même remarque avec IGNORE.

La question est donc comment faire lorsque la clé primaire est de type auto_increment?
Ajouter un compteur sur le nbre de nouvelles lignes saisies? mais je ne vois pas comment écrire les conditions à faire porter dessus.

D'autre part je ne peux pas remettre en cause la structure du formulaire, bien que je me rende compte qu'il est bien plus simple d'effectuer un traitement ligne par ligne du genre:

TantQue nouvelle ligne demandée
Afficher ligne vide
Saisir
Enregistrer
FinTantQue

Sinon je ne reste pas bloqué sur ON DUPLICATE KEY, tout avis bienvenu.

Posté : 23 févr. 2007, 00:04
par piedbleu
Ouaf :) mes enregistrements sont bien reconnus, j'ai oublié un malheureux $.
INSERT INTO article (idarticle, nom_art, qte, pu) 
VALUES ('{article[id][$j]}','{$article[nom][$j]}','{$article[qte][$j]}','{$article[pu][$j]}') 
devient donc:
INSERT INTO article (idarticle, nom_art, qte, pu) 
VALUES ('{$article[id][$j]}','{$article[nom][$j]}','{$article[qte][$j]}','{$article[pu][$j]}')
 
Fin du monologue et résolu :) ![/b]