2008-10-03 10 views
8

En mysql, ¿cómo obtengo la clave primaria utilizada para una operación de inserción, cuando se autoincrementa?Pregunta fácil de mysql con respecto a las claves principales y una inserción

Básicamente, quiero que se devuelva el nuevo valor autoincrementado cuando finalice la instrucción.

Gracias!

+0

Aclaración: El código tiene insertar y luego un last_insert_id. Dos de estas sentencias se ejecutan casi al mismo tiempo y el orden ejecutivo se convierte en inserto # 1 inserto # 2 LAST_INSERT_ID # 1 Completa y devuelve el ID de inserción # 2 LAST_INSERT_ID # 2 completa y devuelve el ID de inserción # 2 ¿Puede suceder esto? – MPX

Respuesta

12

Su comentario de aclaración dice que le interesa asegurarse de que LAST_INSERT_ID() no dé el resultado incorrecto si ocurre otro INSERT concurrente. Tenga la seguridad de que es seguro utilizar LAST_INSERT_ID() independientemente de otra actividad simultánea. LAST_INSERT_ID() devuelve solo la ID más reciente generada durante la sesión actual.

Puede hacerlo por uno mismo:

  1. abrir dos ventanas de concha, ejecutar cliente mysql en todos y conectarse a la base de datos .
  2. Shell 1: INSERTAR en una tabla con una clave AUTO_INCREMENT .
  3. Shell 1: SELECCIONAR LAST_INSERT_ID(), ver resultado.
  4. Shell 2: INSERTAR en la misma tabla.
  5. Shell 2: SELECT LAST_INSERT_ID(), ver resultado diferente del shell 1.
  6. Shell 1: SELECT LAST_INSERT_ID() de nuevo, ver una repetición de principios resultado.

Si lo piensas bien, esta es la única forma que tiene sentido. Todas las bases de datos que admiten mecanismos de autoaumento deben actuar de esta manera. Si el resultado depende de una condición de carrera con otros clientes que posiblemente INSERTen al mismo tiempo, entonces no habría una manera confiable de obtener el último valor de ID insertado en su sesión actual.

+0

¡Gracias! Exactamente lo que quería. – MPX

+0

@Bill Karwin thx mucho para esta útil publicación. Una pregunta: Digamos en un entorno multihilo que el último valor de la clave Auto inc disponible fue 10 ... entonces el hilo del shell 1 no se puede insertar y, al mismo tiempo, el shell dos está insertando ... ¿cuál sería el last_insert_id()? 11 o 12?thx mucho – shadesco

+0

@shadesco: Depende de su versión de MySQL, pero en 5.1 y posterior con InnoDB, la primera sesión incrementaría el auto-inc y ese valor se perdería. Luego, la segunda sesión obtendría 12. Ver http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html –

0

[SELECT max (primary_key_column_name) de nombre_tabla] Ahhh no nessecarily. No soy un chico de MySQL, pero hay una forma específica de obtener la última identificación insertada para la última acción completa que sea un poco más sólida que esta. ¿Qué sucede si ha ocurrido un inserto entre que escribe en la mesa y lo consulta? Lo sé porque me picó hace muchas lunas (así que sí sucede). Si todo lo demás falla, lea el manual: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

Cuestiones relacionadas