Probleme sur ON DUPLICATE KEY UPDATE & WHERE

Jabar
Invité n'ayant pas de compte PHPfrance

20 juil. 2009, 21:19

Bonsoir,

Mon INSERT + ON DUPLICATE KEY UPDATE fonctionne.

Mais dès que je veux rajouter une clause WHERE a l'update, plus rien ne se passe, ni insert (ce qui est normal vu que les clef unique sont duppliquer) mais pas d'update non plus.

J'ai comme erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE b != '10''
mon code :
mysql_query("INSERT INTO table (a,b,c,d,e) VALUES ('a','b','c','d','e') ON DUPLICATE KEY UPDATE a=a+'10', b='10' WHERE b != '10'") or die (mysql_error());
Ou faut'il que je le mette ce WHERE ?

Merci d'avance?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 juil. 2009, 22:35

Il n'y a pas de clause WHERE dans un "ON DUPLICATE KEY UPDATE" :)

En effet, si lors de l'insertion des données la clé primaire existe déjà, l'enregistrement est mis à jour avec les nouvelles valeurs. Il n'y a donc pas de WHERE à spécifier, puisque tu es déjà "positionné" sur l'enregistrement à mettre à jour :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Jabar
Invité n'ayant pas de compte PHPfrance

20 juil. 2009, 22:54

ui mais j'aurais aimer qu'il mette a jour que si la valeur n'est pas égal...

Donc je suis obligé de faire plusieurs requêtes pour mettre à jour :

1 select
une comparaison
et 1 insert ou update...

C'est ça ?

ViPHP
AB
ViPHP | 5818 Messages

21 juil. 2009, 16:46

ui mais j'aurais aimer qu'il mette a jour que si la valeur n'est pas égal...

Donc je suis obligé de faire plusieurs requêtes pour mettre à jour :

1 select
une comparaison
et 1 insert ou update...

C'est ça ?
Dans ce cas je pense comme tu le dis qu'il faut deux requêtes...

Ta condition dans ta syntaxe initiale est incorrecte car "on duplicate key update" est
une instruction qui complémente éventuellement une requête d'insertion.
Et dans une requête d'insertion il n'y a pas de clause where.