2012-01-05 22 views
14

Sé cómo LAST_INSERT_ID() funciona para las columnas autoincrementadas, pero no puedo encontrar la forma de obtener la última identificación que inserté para una columna no autoincrementada.¿Hay alguna forma de obtener la última identificación insertada de una columna INCREMENTADA automáticamente en MySQL?

¿Hay alguna manera de hacerlo?

+4

Si la identificación no es auto-incremento, entonces usted tiene que suministrar en su sentencia INSERT, por lo que ya lo tienes –

+0

@Darhazer: ... posiblemente en otra aplicación, posiblemente en otra máquina, potencialmente en otra red en otro país ....? –

+2

por cierto LAST_INSERT_ID() funciona solo para la sesión que insertó el registro, no devolverá nada desde otra red en otro país :) –

Respuesta

12

puede hacerlo fácilmente usando el mismo LAST_INSERT_ID().

INSERT INTO thetable (id, value) 
VALUES (LAST_INSERT_ID(126), 'some data'); 

SELECT LAST_INSERT_ID(); -- returns 126 
+0

La cosecha me ha dado esta valiosa pieza de conocimiento ... Hay que decir que incluso una selección encadenada se puede utilizar en lugar de la 126 there =) – Manatax

+0

¿Es esto? persistente sobre una conexión? – Manatax

+1

@manatax, su valor está disponible dentro de una conexión hasta que inserte una nueva fila, o actualice el valor como se indica arriba – newtover

0

No hay un orden inherente de las relaciones, no "último insertado registro". Es por eso que el campo AUTO_INCREMENT existe, después de todo.

Tendría que buscar en los registros o guardar en caché el valor usted mismo dentro de su aplicación.

0

No hay forma de que mysql. Pero puedes hacerlo programáticamente. Sin una columna de identificación autoincrementada, no hay forma de que la base de datos sepa qué registros se insertaron en último lugar.

Una forma de hacerlo es utilizar una columna que contenga valores de fecha y hora o valores de fecha y hora. y obtenga el ID del último valor de tmestamp para obtener el último registro insertado

2

Supongo que desea recuperar la última ID insertada más adelante después de insertarla, ya que si la necesita inmediatamente después de insertarla, obviamente ya lo haría saber lo que es el id.

La única forma en que podrá obtener eso es tener otra columna en la tabla que pueda indicar qué fila se insertó por última vez, como una marca de tiempo o una columna de fecha y hora. Si sus identificaciones son únicas y van en aumento, puede usar esa columna. Luego solo selecciona 1 fila ordenada por esa columna en orden descendente.

Por ejemplo

INSERT INTO my_table (id, timestamp) VALUES (123, NOW()) 

SELECT id FROM my_table ORDER BY timestamp DESC LIMIT 1 

Editar: según los comentarios a continuación, es mucho mejor usar una columna AUTO_INCREMENT, aunque esta columna no tiene por qué ser la columna de la id, se podría añadir un auto -incrementar insert_order columna de tipo Int y simplemente ordenar por eso.

+1

Funciona bien para _muy_ aplicaciones de pequeña escala con <= 1 inserción garantizada por segundo. Todo lo que estás haciendo aquí es reinventar 'AUTO_INCREMENT', ¡pero de una manera inferior! –

+2

Tenga en cuenta que una columna de incremento automático es segura para subprocesos. Una marca de tiempo no es. –

+1

Tiene toda la razón, estaba a punto de editar mi publicación para explicar que el uso de una columna AUTO_INCREMENT es mejor, incluso si no es la misma columna que el id. –

1

Supongo que necesita la ID para encontrar la fila recién insertada, en lugar de encontrar la última fila insertada. En una aplicación web, nunca puede estar seguro de que la última fila insertada es la que acaba de crear.

En este caso, podría utilizar un GUID como id. Un GUID generalmente se almacena como una cadena de longitud 36 o como un blob de 16 bytes. El GUID se puede crear antes de insertar la fila, y luego se puede almacenar al insertar la fila.

Dado que el ID no se incrementa automáticamente como lo indicó, debe generarlo de todos modos antes de insertar la fila. La forma más segura de hacerlo es crear un GUID que debe ser lo suficientemente único. De lo contrario, tendrías que determinar la última identificación no utilizada, lo que puede ser complicado y arriesgado.

+0

En la mayoría de los casos, esta es la solución aplicable. es decir, generar su propio identificador y suministrarlo a la instrucción 'INSERT' – SaidbakR

Cuestiones relacionadas