149 votes

MySQL ON DUPLICATE KEY - dernière insérer id ?

J’ai la requête suivante :

Je veux que l’ID de l’insertion ou la mise à jour. Habituellement, je lance une deuxième requête afin d’obtenir ce que je crois insert_id() seules déclarations l’ID « inséré » et pas l’ID de mise à jour.

Y a-t-il un moyen d’insertion/mise à jour et récupérer l’ID de la ligne sans courir deux requêtes ?

Merci, Kevin

Mise à jour : Si la réponse ressemble à ceci :

Merci à tous !

200voto

fredrik Points 5043

Consultez cette page : http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Au bas de la page, ils expliquent comment vous pouvez faire LAST_INSERT_ID significatif pour les mises à jour en passant une expression de cette fonction MySQL.

39voto

Pour être exact, si c'est la l'origine de la requête:

INSERT INTO table (a) VALUES (0)
 ON DUPLICATE KEY UPDATE a=1

et " id " est l'auto-incrémentation de clé primaire que ce serait la solution de travail:

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), a=1

Est tous ici: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Si un tableau contient une colonne de type AUTO_INCREMENT et INSERT ... mise à JOUR insère une ligne, la LAST_INSERT_ID() renvoie la AUTO_INCREMENT de la valeur. Si l'état met à jour une ligne au lieu de cela, LAST_INSERT_ID() n'est pas significatif. Cependant, vous pouvez contourner ce en utilisant LAST_INSERT_ID(expr). Supposons que l'id est le AUTO_INCREMENT la colonne.

2voto

Brent Baisley Points 877

Vous pouvez regarder de remplacer le produit, qui est essentiellement un supprimer/insérer si l’enregistrement existe. Mais cela pourrait changer le champ d’incrémentation automatique s’il est présent, qui pourrait rompre les relations avec d’autres données.

2voto

Je ne sais pas quelle est votre version de MySQL mais avec InnoDB, il y avait un bug avec autoinc

bug dans 5.1.20 et corrigé en 5.1.23 http://bugs.mysql.com/bug.php?id=27405

bug dans 5.1.31 et corrigé en 5.1.33 http://bugs.mysql.com/bug.php?id=42714

0voto

Greg K Points 2566

Il est intéressant de noter, et cela peut être évident (mais je vais le dire quand même pour plus de clarté ici), qui REMPLACENT va souffler existantes de la ligne correspondante avant l'insertion de nouvelles données. SUR le DOUBLE de la CLÉ de mise à JOUR met à jour uniquement les colonnes que vous spécifiez et conserve la ligne.

À partir du manuel:

REMPLACER fonctionne exactement comme INSERT, sauf que, si une ancienne ligne dans le tableau a la même valeur qu'une nouvelle ligne pour un CLÉ PRIMAIRE ou un index UNIQUE, le vieux ligne est supprimée avant la nouvelle ligne est inséré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X