Cuando hago una sola fila INSERT
en una tabla que tiene una AUTO_INCREMENT
columna, me gustaría usar la LAST_INSERT_ID()
función para devolver el nuevo AUTO_INCREMENT
valor editado para esa fila.
Como muchos desarrolladores y administradores de Microsoft SQL Server, sin duda, saben que la funcionalidad equivalente en SQL Server ( SCOPE_IDENTITY
y @@IDENTITY
) no ha estado exenta de problemas .
Sé que el estado de los documentos MySQL:
La ID que se generó se mantiene en el servidor por conexión . Esto significa que el valor devuelto por la función a un cliente dado es el primer
AUTO_INCREMENT
valor generado para la declaración más reciente que afecta a unaAUTO_INCREMENT
columna de ese cliente . Este valor no puede verse afectado por otros clientes, incluso si generanAUTO_INCREMENT
sus propios valores. Este comportamiento garantiza que cada cliente pueda recuperar su propia ID sin preocuparse por la actividad de otros clientes y sin la necesidad de bloqueos o transacciones.
e incluso ir tan lejos como para decir:
Usar
LAST_INSERT_ID()
yAUTO_INCREMENT
columnas simultáneamente de múltiples clientes es perfectamente válido.
¿Existen riesgos o escenarios conocidos que puedan hacer que LAST_INSERT_ID()
no se devuelva el valor correcto?
Estoy usando MySQL 5.5 en CentOS 5.5 x64 y Fedora 16 x64 y el motor InnoDB.
Para ampliar aún más el punto número 2 en la respuesta dada por DTest:
En las versiones de MySQL que he usado, es una buena idea restablecer explícitamente el valor de LAST_INSERT_ID antes de cada bloque de código donde planea realizar una inserción.
Esto se puede hacer así:
Después de que se ejecute la serie anterior de declaraciones, sabrá si la inserción tuvo algún efecto al verificar si LAST_INSERT_ID todavía estaba configurado en "some_flag_init_value_of_your_choice" al final de la ejecución.
De lo contrario, puede terminar con la siguiente situación problemática:
Debido a que la segunda inserción ha fallado , es posible que haya esperado que la segunda llamada a LAST_INSERT_ID devuelva NULL o que produzca un conjunto de resultados vacío (cero filas). El hecho de que todavía devuelva un identificador entero válido puede inducirlo a error a pensar que el segundo inserto tuvo ÉXITO cuando no lo hizo.
Las cosas se ponen MÁS EXTRAÑAS cuando consideras que LAST_INSERT_ID continuará preservando y repitiendo la última identificación única exitosa, incluso si las siguientes declaraciones de inserción fallidas apuntan a tablas diferentes a la tabla que produjo la última identificación única exitosa. En otras palabras, inserta en la tabla TA y obtiene una identificación de 5, luego inserta en TB (pero falla), pero aún ve un 5. Basado en eso, cree que acaba de crear una nueva fila en TA con id de 5 y una nueva fila en TB con id de 5, mientras que en realidad no existe ninguna fila en TB con id 5, o sí existe tal fila, pero en realidad no tiene nada que ver con ningún código que simplemente corrió.
fuente
last_insert_id()
para juzgar si una consulta había tenido éxito. Después de todo, es el último Id insertado, que contiene los valores que necesita cuando ya sabía que había tenido éxito.