INSERT INTO [...] ON DUPLICATE KEY UPDATE [...] [Résolu]

xactise 507 Messages postés mardi 18 février 2003Date d'inscription 22 juin 2012 Dernière intervention - 21 janv. 2010 à 14:34 - Dernière réponse : tpoinsot 345 Messages postés mardi 1 juin 2004Date d'inscription 17 octobre 2014 Dernière intervention
- 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...
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
lenono75 17 Messages postés jeudi 27 mai 2004Date d'inscription 12 février 2014 Dernière intervention - 21 janv. 2010 à 16:22
3
Merci
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.

Merci lenono75 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de lenono75
Meilleure réponse
xactise 507 Messages postés mardi 18 février 2003Date d'inscription 22 juin 2012 Dernière intervention - 21 janv. 2010 à 16:41
3
Merci
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...

Merci xactise 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de xactise
tpoinsot 345 Messages postés mardi 1 juin 2004Date d'inscription 17 octobre 2014 Dernière intervention - 21 janv. 2010 à 16:17
0
Merci
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
Commenter la réponse de tpoinsot
tpoinsot 345 Messages postés mardi 1 juin 2004Date d'inscription 17 octobre 2014 Dernière intervention - 21 janv. 2010 à 16:31
0
Merci
@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
Commenter la réponse de tpoinsot
lenono75 17 Messages postés jeudi 27 mai 2004Date d'inscription 12 février 2014 Dernière intervention - 21 janv. 2010 à 16:50
0
Merci
Content que ça te plaise, eu quelques soucis aussi il y a quelques mois...
Commenter la réponse de lenono75
tpoinsot 345 Messages postés mardi 1 juin 2004Date d'inscription 17 octobre 2014 Dernière intervention - 21 janv. 2010 à 16:54
0
Merci
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
Commenter la réponse de tpoinsot
xactise 507 Messages postés mardi 18 février 2003Date d'inscription 22 juin 2012 Dernière intervention - 21 janv. 2010 à 17:15
0
Merci

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...
Commenter la réponse de xactise
tpoinsot 345 Messages postés mardi 1 juin 2004Date d'inscription 17 octobre 2014 Dernière intervention - 25 janv. 2010 à 15:38
0
Merci
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
Commenter la réponse de tpoinsot

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.