INSERT INTO [...] ON DUPLICATE KEY UPDATE [...]

Résolu
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 - 21 janv. 2010 à 14:34
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 - 25 janv. 2010 à 15:38
Bonjour à tous après avoir tenter de poser une question sur le forum SQL de CS, qui est peu fréquenté je me suis dit que je trouverai peut-être une solution avec mes amis de PHP CS ;)



avec une requete du type
INSERT INTO [...] ON DUPLICATE KEY UPDATE [...]
peux t-on savoir si c un INSERT ou un UPDATE qui à été effectué ?


D'avance merci


PS : http://www.sqlfr.com/forum/sujet-INSERT-INTO-ON-DUPLICATE-KEY-UPDATE_1398353.aspx


L0rD...
A voir également:

8 réponses

lenono75 Messages postés 17 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 12 février 2014
21 janv. 2010 à 16:22
Bonjour,

Avec mysql, tu auras en retour :
"Query OK, 2 rows affected"
si c'était un update. Mysql considère qu'il y a eu 2 opérations, même si en fait il n'y en n'avait qu'une.
"Query OK, 1 row affected", signifiera qu'il y a bien eu un insert.

Bonne journée,

Arnaud

PS : je poste cross avec http://www.sqlfr.com/forum/sujet-INSERT-INTO-ON-DUPLICATE-KEY-UPDATE_1398353.aspx volontairement pour faire connaitre la réponse.
3
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
21 janv. 2010 à 16:41
On ne peut pas avoir N enregistrement tpoinsot sinon il n'y aurait pas ON DUPLICATE KEY ;)

Merci

je venais jsute de trouver la réponse sur php.net

If you use "INSERT INTO ... ON DUPLICATE KEY UPDATE" syntax, mysql_affected_rows() will return you 2 if the UPDATE was made (just as it does with the "REPLACE INTO" syntax) and 1 if the INSERT was.

So if you use one SQL request to insert several rows at a time, and some are inserted, some are just updated, you won't get the real count.


Merci je valide



L0rD...
3
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
21 janv. 2010 à 16:17
Bonjour,
non, je ne crois, mais si tu as un autoincrement et un timestamp dans l'insert/update, tu auras tout.
Tu as la valeur max de l'autoincrement avant la requête et après exécution les plus grands sont les insert, quant aux plus petits, ce sera avec le timestamp que tu connaitras les update.

Quelqu'un a une autre idée ?


thip
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
21 janv. 2010 à 16:31
@lenono75 : c'est vrai pour un seul enregistrement à traiter; mais c'est peut-être ce que voulait xactise. En revanche, quand on a n enregistrements à traiter ... on peut savoir le nombre d'insert et le nombre d'update mais pas qui.
En fait, ça dépend de ce qu'on veut, et finalement, je crois que xactise ne veut savoir que pour un seul enregistrement, don il sait lequel.


thip
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lenono75 Messages postés 17 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 12 février 2014
21 janv. 2010 à 16:50
Content que ça te plaise, eu quelques soucis aussi il y a quelques mois...
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
21 janv. 2010 à 16:54
Si, tu peux avoir plusieurs enregistrements !!! c'est même très pratique.

Tiens, vas voir la doc.

Tu verras un exemple :

insert into test2 select * from test1 on duplicate key update a = 'REMOVE-ME';

mysql> select * from test2;


+----+-----------+------+
| id | a | b |
+----+-----------+------+
| 1 | a1 | b1 |
| 2 | REMOVE-ME | b2 |
| 4 | a1 | b3 |
+----+-----------+------+

thip
0
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
21 janv. 2010 à 17:15

Si a=1 OR b=2 trouve plusieurs lignes, uniquement une ligne sera mise à jour! En général, il faut éviter d'utiliser la clause ON DUPLICATE KEY sur des tables avec des clés UNIQUE multiples.

Depuis MySQL version 4.1.1, on peut utiliser la fonction VALUES(col_name) pour faire référence à la valeur de la colonne dans la clause INSERT d'une commande INSERT ... UPDATE : c'est la valeur qui sera insérée s'il n'y a pas de conflit de clé. Cette valeur est particulièrement utile dans les commandes INSERT ... UPDATE et retourne NULL sinon.



L0rD...
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
25 janv. 2010 à 15:38
Il s'agit effectivement d'un exemple désastreux sur une clef primaire constituée de 2 champs. Danger.

Mais la page suivante de la documentation donne un exemple sans contestation :

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

That statement is identical to the following two statements:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=3;
INSERT INTO table (a,b,c) VALUES (4,5,6)
ON DUPLICATE KEY UPDATE c=9;

maintenant c'est comme tu veux, ton problème était résolu. Mais c'est dommage de ne pas voir plus loin.

thip
0
Rejoignez-nous