2008-10-03 9 views
8

Dans mysql, comment obtenir la clé primaire utilisée pour une opération d'insertion, lorsqu'elle est auto-incrémentée.Question mysql facile concernant les clés primaires et un insert

Fondamentalement, je veux que la nouvelle valeur auto-incrémentée soit retournée quand l'instruction se termine.

Merci!

+0

Clarification: Le code a alors un last_insert_id. Deux de ces EXECUTE presque en même temps et l'ordre exec se transforme en insert # 1 insert # 2 LAST_INSERT_ID # 1 Remplit et renvoie l'ID de insert # 2 LAST_INSERT_ID # 2 Remplit et renvoie l'ID de insert # 2 Est-ce que cela peut arriver? – MPX

Répondre

12

Votre commentaire de clarification indique que vous êtes intéressé à vous assurer que LAST_INSERT_ID() ne donne pas le mauvais résultat si un autre INSERT concurrent se produit. Soyez assuré qu'il est sécuritaire d'utiliser LAST_INSERT_ID() indépendamment des autres activités concurrentes. LAST_INSERT_ID() renvoie uniquement l'ID le plus récent généré pendant la session en cours.

Vous pouvez essayer vous-même:

  1. Ouvrez deux fenêtres shell, exécutez client mysql dans chaque base de données et se connecter à . Shell 1: INSERT dans une table avec une clé AUTO_INCREMENT . Shell 1: SELECT LAST_INSERT_ID(), voir le résultat.
  2. Shell 2: INSERT dans la même table.
  3. Shell 2: SELECT LAST_INSERT_ID(), voir résultat différent de coque 1.
  4. Shell 1: SELECT LAST_INSERT_ID() à nouveau, voir une répétition de résultat plus tôt.

Si vous y pensez, c'est le seul moyen logique. Toutes les bases de données qui prennent en charge les mécanismes de clé auto-incrémentés doivent agir de cette manière. Si le résultat dépend d'une condition de concurrence avec d'autres clients éventuellement INSÉRER simultanément, il n'y aurait aucun moyen fiable d'obtenir la dernière valeur d'ID insérée dans votre session en cours.

+0

Merci! Exactement ce que je voulais. – MPX

+0

@Bill Karwin beaucoup pour cet article utile. Une question: Dites dans un environnement multithread que la dernière valeur de clé auto inc disponible était 10 .. alors le thread du shell 1 ne parvient pas à insérer et au même moment le shell deux insère .. qu'est-ce que last_insert_id()? 11 ou 12?beaucoup de choses – shadesco

+0

@shadesco: Cela dépend de votre version de MySQL, mais en 5.1 et plus tard avec InnoDB, la première session incrémenterait l'auto-inc et cette valeur serait perdue. Ensuite, la deuxième session aurait 12. Voir http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html –

0

[select max (primary_key_column_name) à partir de table_name] Ahhh pas nessecarily. Je ne suis pas un mec MySQL mais il existe des moyens spécifiques pour obtenir le dernier identifiant inséré pour la dernière action terminée qui soit un peu plus robuste que cela. Que se passe-t-il si une insertion s'est produite entre vous écrivez à la table et l'interroger? Je sais parce que ça m'a piqué il y a plusieurs lunes (alors oui ça arrive). Si tout le reste échoue lire le manuel: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

Questions connexes