sábado, 17 de septiembre de 2011

Obtener la última ID insertada en una tabla con Autoincrement para MySQL

Hay ocasiones en las que queremos obtener la última ID insertada en una tabla la cual hemos especificado con Autoincrement, ya sea para para insertarla en otra tabla (una relación) o por ejemplo para generar un link dinámicamente (pagina.php?articulo=123). En ciertas circunstancias bastaría con un simple “Select ID From Tabla1 Where CampoUnico=ValorInsertado” donde CampoUnico podría ser Email o Nombre de usuario. Pero ¿qué pasa si la tabla en cuestión no tiene campos con valores únicos?

Bueno por esta razón lo más recomendable es usar LAST_INSERT_ID(), un método (como su nombre lo indica) que nos regresa la última ID insertada en nuestra tabla para un campo Autoincrement. Su objetivo vendría siendo el mismo que @@identity de Microsoft SQL Server.

LAST_INSERT_ID vs MAX(id)

Investigando un poco por internet nos podemos topar con otro método (Muy malo para la situación que tenemos planteada hoy) el cual consiste en seleccionar la ID de valor más alto “Select MAX(id) From tabla1” y digo malo porque si otro usuario inserto un nuevo registro, nuestro Select nos podría regresar la ID de alguien más. A diferencia de LAST_INSERT_ID que le regresa el valor deseado a cada Conexión.

Código

Bueno aquí esta lo que seguramente les interesa, un ejemplo:

INSERT INTO Tabla1(Titulo) VALUES("dddd");
SELECT LAST_INSERT_ID();

Caso especial

Hay un caso un poco raro en el que LAST_INSERT_ID podría no funcionar. Cuando estaba haciendo este post y quise probar el código en otro archivo .php apareció algo muy raro, en uno no funcionaba el LAST_INSERT_ID y en el otro archivo si (aclaro, no era problemas de conexión o algo por el estilo por que las otras consultas, como Insert, si funcionaban). En ambos archivos llamaba al mismo StoredProcedure (sin parámetros), de modo que el problema no era tanto de código SQL. Googleando un poco nos podemos dar cuenta de que esto le a pasado a más de uno, si este es tu caso, la solución es muy sencilla: Asigna el valor de LAST_INSERT_ID a una variable. A continuación el ejemplo:

DECLARE IdUltima INT;
INSERT INTO Tabla1(Titulo) VALUES("dddd");
SET IdUltima = -1;
SELECT LAST_INSERT_ID() INTO IdUltima;
SELECT IdUltima;

No hay comentarios:

Publicar un comentario