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

Signaler
Messages postés
507
Date d'inscription
mardi 18 février 2003
Statut
Membre
Dernière intervention
22 juin 2012
-
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
-
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

Messages postés
17
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
12 février 2014

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.
Messages postés
507
Date d'inscription
mardi 18 février 2003
Statut
Membre
Dernière intervention
22 juin 2012
2
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...
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
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
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
@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
Messages postés
17
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
12 février 2014

Content que ça te plaise, eu quelques soucis aussi il y a quelques mois...
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
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
Messages postés
507
Date d'inscription
mardi 18 février 2003
Statut
Membre
Dernière intervention
22 juin 2012
2

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...
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
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