Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

obtener el id generado de una sentencia insert

Estas en el tema de obtener el id generado de una sentencia insert en el foro de Mysql en Foros del Web. Hola a todos/as, Tengo la siguiente duda: Tengo que hacer un insert en una tabla que tiene por clave primaria un campo llamado "id" de ...
  #1 (permalink)  
Antiguo 29/05/2014, 04:30
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 15 años, 8 meses
Puntos: 7
obtener el id generado de una sentencia insert

Hola a todos/as,

Tengo la siguiente duda:

Tengo que hacer un insert en una tabla que tiene por clave primaria un campo llamado "id" de tipo auto_increment.

Necesito saber el id que se ha generado en la sentencia anterior, ya que ese campo actua de foreign key en otra tabla donde tengo que insertar información también.

He leido por internet que hay muchas formas de obtener el último id insertado en una tabla como por ejemplo:

Código:
mysql_insert_id()
Código:
LAST_INSERT_ID()

La duda que me entra es la siguiente:

Se trata de un sistema multiusuario donde se pueden estar realizando inserciones en dicha tabla de forma simultanea. Si ejecuto la instrucción anterior, ¿no puede ser, que se haya producido un insert por parte de otro usuario después del mio y me devuelve otro id que no corresponde con mi inserción?



Leyendo la documentación de las funciones anteriores he visto que aparece lo siguiente:

"El último ID generado se mantiene en el servidor para cada conexión. Esto significa que el valor de la función retorna a cada cliente el valor AUTO_INCREMENT más reciente generado por ese cliente. Este valor no puede ser afectado por otros clientes, incluso si generan valores AUTO_INCREMENT ellos mismos. Este comportamiento asegura que reciba sus propios IDs sin tener en cuenta la actividad de otros clientes y sin la necesidad de bloqueos o transacciones."


Si no entiendo mal, con el uso de las funcines anteriores evitaria el problema que comenté antes de trabajar con sistemas con múltiples usuarios no?

Saludos.

Última edición por aeb_asturias; 29/05/2014 a las 05:12
  #2 (permalink)  
Antiguo 29/05/2014, 05:16
 
Fecha de Ingreso: abril-2013
Mensajes: 61
Antigüedad: 6 años, 7 meses
Puntos: 4
Respuesta: obtener el id generado de una sentencia insert

Buenas, yo utilizo

Código MySQL:
Ver original
  1. SELECT @@identity AS id

y nunca tuve ningun problema de lo que comentas.
  #3 (permalink)  
Antiguo 29/05/2014, 05:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 12 años
Puntos: 2653
Respuesta: obtener el id generado de una sentencia insert

Cita:
mysql_insert_id()
Eso es PHP, no MySQL.

Cita:
LAST_INSERT_ID()
Esto es MySQL.

El valor del ultimo ID autoincremental generado para cualquier tabla (no las diferencia), se mantiene mientras no se ejecute ninguna sentencia posterior en la misma conexión.
Eso no implica que el siguiente ID sea el siguiente en la secuencia si hay más de un usuario ejecutando inserts.
Tampoco se devuelve el ultimo ID generado en un INSERT masivo (donde mandas N valores de N registros en una sola sentencia), en ese caso devuelve el primero solamente.

En el manual de referencia hay un capitulo entero dedicado a este tema. Leelo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 29/05/2014, 05:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: obtener el id generado de una sentencia insert

Si exactamente se refiere a evitar ese problema cuando dice:

Cita:
...la función retorna a cada cliente el valor AUTO_INCREMENT más reciente generado por ese cliente...
pero como bien dice @gnzsoloyo hay otros problemas. Eso no quiere decir que no se pueda usar.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 29/05/2014, 05:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 12 años
Puntos: 2653
Respuesta: obtener el id generado de una sentencia insert

Cita:
Iniciado por nanotk58 Ver Mensaje
Buenas, yo utilizo

Código MySQL:
Ver original
  1. SELECT @@identity AS id

y nunca tuve ningun problema de lo que comentas.
Eso es usando variables, no funciones directas. Es un contexto diferente.

Ver tema variables en MySQL: http://dev.mysql.com/doc/refman/5.0/es/set-option.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 29/05/2014, 06:21
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 15 años, 8 meses
Puntos: 7
Respuesta: obtener el id generado de una sentencia insert

Gracias a todos por responder.

En principio no realizo insert masivos, sino un único insert, por lo que entiendo que si uso "LAST_INSERT_ID()" no tendré problemas en recuperar el id.

Como comenté al principio, ese id lo recupero para luego insertar información en otra tabla. Si este segundo insert fallará por cualquier causa, debería eliminar el primer insert realizado en la base de datos.

Para llevar eso a cabo, tendría hacer uso de transacciones no?


Saludos y gracias de nuevo.
  #7 (permalink)  
Antiguo 29/05/2014, 07:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 8 meses
Puntos: 574
Respuesta: obtener el id generado de una sentencia insert

Si, transacciones.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 29/05/2014, 08:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 12 años
Puntos: 2653
Respuesta: obtener el id generado de una sentencia insert

Siempre y cuando sean tablas InnoDB, te conviene transacciones.
Ocasionalmente puedes manejar toa la lógica del caso en un SP. Esto también ayuda, en especial si el SP se ejecuta en la transacción.
Lo que si debes recordar es que el ROLLBACK de una transacción no vuelve atrás el auto_incremental obtenido. Ese se pierde, y el que se obtenga será luego del ROLLBACK será el siguiente al generado en la TX.
Es inevitable.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 29/05/2014, 11:17
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 15 años, 8 meses
Puntos: 7
Respuesta: obtener el id generado de una sentencia insert

Muchas gracias de nuevo.

Mis tablas son InnoDB así que en principio si puedo utilizar transacciones.

Y por lo que se comenta, es una pena que se pierda el id auto_incremental cuando se hace un roolback.......

Etiquetas: campo, insert, select, sentencia, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:01.