J'ai la requête suivante:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
Je veux l'ID de l'insertion ou de la mise à jour. Habituellement, j'exécute une deuxième requête pour obtenir cela car je pense que insert_id () ne renvoie que l'ID «inséré» et non l'ID mis à jour.
Existe-t-il un moyen d'insérer / mettre à jour et de récupérer l'ID de la ligne sans exécuter deux requêtes?
alter table tablename AUTO_INCREMENT = 0;
après la requête ci-dessus, pour éviter de grandes lacunes dans vos valeurs d'identifiant.Réponses:
Consultez cette page: https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Au bas de la page ils expliquent comment vous pouvez rendre LAST_INSERT_ID significatif pour les mises à jour en passant une expression à cette fonction MySQL.
À partir de l'exemple de documentation MySQL:
la source
Pour être exact, s'il s'agit de la requête d'origine:
et 'id' est la clé primaire auto-incrémentée que ce serait la solution de travail:
Tout est ici: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
la source
Vous pouvez regarder REMPLACER, qui est essentiellement une suppression / insertion si l'enregistrement existe. Mais cela modifierait le champ d'incrémentation automatique s'il était présent, ce qui pourrait rompre les relations avec d'autres données.
la source
Je ne sais pas quelle est votre version de MySQL mais avec InnoDB, il y a eu un bug avec autoinc
bug dans 5.1.20 et corrigé dans 5.1.23 http://bugs.mysql.com/bug.php?id=27405
bogue dans 5.1.31 et corrigé dans 5.1.33 http://bugs.mysql.com/bug.php?id=42714
la source
J'ai rencontré un problème, lorsque ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID (id) incrémente la clé primaire de 1. Ainsi, l'identifiant de la prochaine entrée dans la session sera incrémenté de 2
la source
Il est intéressant de noter, et cela peut être évident (mais je le dirai quand même pour plus de clarté ici), que REPLACE supprimera la ligne correspondante existante avant d'insérer vos nouvelles données. ON DUPLICATE KEY UPDATE ne met à jour que les colonnes que vous spécifiez et préserve la ligne.
À partir du manuel :
la source
Les solutions existantes fonctionnent si vous utilisez l'auto-incrémentation. J'ai une situation où l'utilisateur peut définir un préfixe et il devrait redémarrer la séquence à 3000. En raison de ce préfixe varié, je ne peux pas utiliser l'auto-incrémentation, ce qui rend last_insert_id vide pour les insertions. Je l'ai résolu avec ce qui suit:
Si le préfixe existe, il l'incrémentera et remplira last_insert_id. Si le préfixe n'existe pas, il insérera le préfixe avec la valeur 3000 et remplira last_insert_id avec 3000.
la source