En diversas ocasiones muchos de nuestros alumnos nos han preguntado, como obtener el ‘id’ del ultimo registro insertado y si tu eres programador sabrás lo útil que resulta obtener el ultimo valor del ‘id’ para después utilizarlo en alguna otra operación y/o consulta.
En esta ocasión nos enfocaremos a bases de datos MySQL y SQL Server.
Para que las siguientes operaciones funcionen adecuadamente es necesario que el campo ‘id’ sea indice (MySQL) o clave principal (SQL Server) y que sea ‘auto-increment ‘ (autonumerico).
Empezemos
@@identity
Este es un metodo muy conocido, consiste en utilizar la sintaxis “SELECT @@identity AS id” y devuelve el id del ultimo ingreso, por ello se debe utilizar inmediatamente después de usar la sentencia INSERT.
MAX(id)
Otra forma es mediante la sentencia “SELECT MAX(id) AS id FROM tabla”. La ventaja de este método con respecto al anterior es que no es necesario utilizarlo inmediatamente despues de utilizar la sentencia INSERT; ya que este método busca el id de mayor valor dentro de la tabla y como es auto incrementable el mayor siempre sera el ultimo.
mysql_insert_id
Este metodo funciona solo con PHP y MySQL: mysql_insert_id(). Al igual que la propiedad @@identity, solo retorna el id del ultimo registro ingresado independientemente de la tabla en la que se haya realizado la operacion.
$id=mysql_insert_id();
Permalink
Excelente aporte, lo estaba buscando desde hace ya algunos días. Me han salvado…!!!
Espero siga poniendo mas información de programación
Permalink
Esto es una mala practica en entornos multiusuarios, en realidad es lo peor que podria hacerse si se tienen conexiones recurrentes a la DB.
Para ello la solucion mas optima (en el caso de MySQL) es utilizar mysql_insert_id().
Aca la fuente de lo que estoy diciendo (en inglés):
Forget about using MAX to get the last inserted id. Race conditions like other users inserting between your SELECT MAX(.. and your INSERT may render your id unusable.
The WAY to get the id is by using mysql_insert_id() or the mysql SQL function LAST_INSERT_ID().
Take care, if using mysql_insert_id() you should provide the resource returned by the mysql_connect, not the resultset returned by mysql_query.
Permalink
Agradesco tu comentario, pero por lo visto no leiste ‘todo’ el articulo, si vuelves a leerlo te daras cuenta que si hablo de la insctrucción mysql_insert_id().
El articulo tiene como proposito mostrar las diversas formas de obtener el ultimo ID insertado y esto es aplicable para base de datos SQL y MySql. Dependiendo el tipo de proyecto que estes realizando puedes tomar la opción de usar uno u otro.
Permalink
estoy en Visual Basic y SQL Server pero no se como ago para mostrarlo el ultimo id en un texbox ……agradesco su respuesta..
Permalink
Hola Hector!
Si has dado cuenta, en los dos ejemplos de Vd y SQL, el resultado de la operación se almacena en la variable “id”, dicha variable almacena el valor de ultimo numero insertado.
Si estas usando tus instrucciones SQL en el mismo formulario, lo unico que debes hacer es asignarle a tu cuadro de texto el valor de la variable, ejemplo:
textbox1.text = id
(Aunque no me dijiste la versión de Vb que usan, quiero suponer que ya estas en .NET.)
Si usas MAX(id)
Si la instruccion SQL esta dentro de un modulo, podrias meter la instruccion dentro de una función que te devuelve un valor de tipo ‘integer’, ejemplo
Public Function obtenerId() as Integer
// aquí van tus intrucciones SQL
Return CInt(dt.Rows(0).Item(0).ToString())
end function
Y lo unico que tendrias que hacer es asignarle a tu cuadro de texto la función (recuerda que te va a retornar el valor del ultimo id)
Ejemplo:
textbox1.text = obtenerId()
Espero te haya quedado claro. Saludos!!!
Permalink
Buenas estoy utilizando este codigo y al imprimir la consulta me muestra como ultimo registro el numero 0, y ya poseo registros guardados, me podrian ayudar. correo yelitza1279@yahoo.es
Permalink
Hola Yelitza, para poder ayudarte, primero tienes que decirme que lenguaje de programación estas utilizando y que base de datos.
Si pudieras mandarme el código, podría ayudarte mejor; puedes mandarlo a info@escuelactec.com
Permalink
mysql_insert_id esta descontinuado a partir de PHP 5.5.0, y será eliminada en el futuro.
http://www.php.net/manual/es/function.mysql-insert-id.php
en su lugar recomiendan mysqli_insert_id
http://www.php.net/manual/es/mysqli.insert-id.php
Saludos
Permalink
Damian lo que comentas es correcto, de hecho hace un tiempo publicamos un articulo sobre las Nuevas funciones de PHP, aquí te dejo el link: http://blog.escuelactec.com/?p=395
Permalink
como hago para el MAXid mostrarlo en un text ??
Permalink
Usando el ejemplo:
$query= mysql_query("SELECT MAX(id_tabla) AS id FROM tabla");
if ($row = mysql_fetch_row($query))
{
$id = trim($row[0]);
}
Si solo deseas imprimirlo en pantalla, seria:
echo $id;
Si deseas imprimir dentro de un text de formulario,sería:

Saludos, espero te sea útil.
Permalink
completando la pregunta anterior “Como hago para el MAXid mostrarlo en un text para PHP y SQL , porsiacaso mi BD esta en postgres
Permalink
Hola Ericka!!
La forma de usar MAX(campo) seria la misma al usar PostgreSQL
Permalink
nececito este scrip pero con la tabla en ceros
Permalink
Oscar un saludo!!
¿Podrías ser mas especifico en tu comentario?. Si tu tabla esta en blanco e ingresas un registros las funciones mencionadas te mostraran el id de ese registro insertado, en este caso seria uno (1).
Permalink
El MAX(id) funciona perfectamente con visual basic y acces, Gracias por el aporte.
Permalink
Me alegra saber que te fue útil, no dejes de visitar nuestro canal de Youtube.com/escuelactec
Permalink
Hola,
me gustaría saber como realizar esta gestion.
Yo utilizo php y access (por motivos de necesidad), la cuestión es que cuando realizo un ‘echo’ y deseo imprimir todos los campos de una tabla, el campo autonumerico no me lo muestra y no entiendo bien el porqué.
Sabrías indicarme qué no estoy teniendo en cuenta? o que me falta añadir en el echo para que me muestre ese campo, que necesito saber para poder hacer las funciones de editar, borrar, etc..
muchas gracias por adelantado!
Permalink
Hola Darío. Para darte una solución a tu problema, seria necesario que me mandaras el código que utilizas. Puedes mandarlo a info@escuelactec.com
Saludos
Permalink
Hola,quisiera saber como puedo obtener el ultimo registro ingresado, o sea ademas del id, los otros campos correspondientes al registro. Gracias
Permalink
Evelyn, lo que podrías hacer es lo siguiente:
1) obtener el id del ultimo registro insertado
2) realizar una nueva consulta a la base de datos utilizando el id que acabas de obtener
y de esta forma obtendrías todos los campos del ultimo registro insertado.
Espero te sea de utilidad, si así fue, déjamelo saber, Saludos
Permalink
Lo lograste hacer?
Permalink
Hola muchas gracis por tu articulo esta super util.
Una consulta quiero usar la sentencia SELECT MAX(Cod_Int) FROM impresora , pero me devuelve solo el id, kiero me devuelva todos los campos del registro. Como seria la sentencia, agradeceria tu ayuda. 😀
Permalink
recién leí la respuesta en un comentario!!
Permalink
lo resolvi de esta manera:
select * from usuarios where ID_USUARIO= (select max(ID_USUARIO) from usuarios)
Permalink
Teoria:
———————————————————————————–
$query= mysql_query(“SELECT @@identity AS id”);
if ($row = mysql_fetch_row($query))
{
$id = trim($row[0]);
}
———————————————————-
practica
———————————————————
——————-sql —————————-
create procedure [dbo].[SIGESA_RecetaCabeceraAgregar]
(@idReceta int output,
@IdPuntoCarga int,
@FechaReceta DateTime,
@idCuentaAtencion int,
@idServicioReceta int,
@idEstado int,
@idComprobantePago int,
@idMedicoReceta int,
@FechaVigencia DateTime,
@IdUsuarioAuditoria int)
as insert into RecetaCabecera (
IdPuntoCarga,FechaReceta,idCuentaAtencion,idServicioReceta,idEstado,idComprobantePago,idMedicoReceta,FechaVigencia) values (
@IdPuntoCarga,@FechaReceta,@idCuentaAtencion,@idServicioReceta,@idEstado,@idComprobantePago,@idMedicoReceta,@FechaVigencia)
set @idReceta = @@identity
———————————————————
————————– metodo guardar ————————
public function GuardarRecetaCabecera() {
$save = “EXEC SIGESA_RecetaCabeceraAgregar
”,
‘” . $this->IdPuntoCarga . “‘,
‘” . $this->FechaReceta . “‘,
‘” . $this->idCuentaAtencion . “‘,
‘” . $this->idServicioReceta . “‘,
‘” . $this->idEstado . “‘,
‘” . $this->idComprobantePago . “‘,
‘” . $this->idMedicoReceta . “‘,
‘” . $this->fechaVigencia . “‘,
‘2’”;
$this->db()->query($save);
$query = “SELECT @@identity AS id”;
$query = $this->db()->query($query);
while ($row = $query->fetch(PDO::FETCH_UNIQUE)) {
$resultSet= trim($row[0]);
}
return $resultSet;
$this->db->null;
}
————————recuperar valor ———————
$Save= $RecetaCabecera->GuardarRecetaCabecera();
echo $Save ;
————————————————————————————————–
si tiene una mejor solucion voy a agracerles … me funciona bien por el momento
Permalink
Hola y si lo que necesito es que me filtre la ultima inserción de un producto, pero por el nombre y no con el id.
Permalink
Cuando se utiliza la instrucción mysqli_insert_id, se obtiene el ultimo id insertado y de alli puedes hacer una consulta para obtener con ello el registro completo y de alli poder obtener el nombre del producto
Permalink
Muy buena explicación.. a mysql_insert_id solo se lo puede utilizar luego del insert ?.. por que si solo retorna el id del ultimo registro ingresado independientemente de la tabla en la que se haya realizado la operacion como puedo utilizarlo?..
Saludos
Permalink
Puedes usar la sentencia SELECT @@identity AS id, la cual se debe ejecutar inmediatamente después de realizar la inserción
Permalink
que pasa si existen usuarios concurrentes y los dos generaron inserción a la vez? como se puede volver único a ese id capturado para poder realizar otras actualizaciones?
Permalink
Si revisas el manual, la instrucción mysql_insert_id, trabaja sobre la conexión actual,es decir, ‘tú conexión’ (como si fuera una sesión), así que aunque haya otros usuarios insertando datos, cada uno trabaja sobre su conexión. A menos que hagas la operación o hayas cerrado tu conexión, en este caso si tendrías problemas.
Permalink
Hola, mi nombre es Germán,
Tengo la siguiente inquietud, estoy haciendo un formulario y es como si fuera un tipo factura, a que voy, quiero que cuando ingrese a este formulario se muestre el consecutivo, de esta manera la persona ya sabe cual es su numero de formulario; que funcion de php me recomiendan que si depronto tengo multisuarios no me vaya generar conflicto?
Permalink
Si es un sistema multi-usuarios, no se podría tener el numero especifico del próximo registro a insertar, pues es posible que en ese momento otros usuarios estén insertando registro a la tabla y eso alteraría el numero de Id.
Lo que podrías hacer es mostrar el siguiente Id en el momento que se cargue el formulario, pero al finalizar el proceso de inserción, confirmarle al usuario si el Id sigue siendo el mismo o si ya cambio.
Espero haberme explicado
Permalink
SALUDES A TODOS,
Tengo una tabla relacionada, donde realizo una consulta con SELECT pero quiero que me muestre el ultimo registro, llamando el ID para que muestre todos los valores de ese campo.
$resultados = mysqli_query($conexion,”SELECT * FROM resultados WHERE doc = $doc”);
while($consulta = mysqli_fetch_array($resultados))
Permalink
Hola Juan
Por lo que entiendo en tu comentario, solo deseas hacer visualizar un registro de la tabla en base a su ID, por lo tanto no es necesario crear un bucle While, pues esto solo se usa cuando son 2 o mas registros que te devuelve la consulta, aquí lo único que tienes que hacer es lo siguiente:
$query = mysqli_fetch_array($resultado);
echo $query['nombre_del_campo'];
Te dejo el link de la documentación oficial mysqli_fetch_array
Espero haber dado respuesta a tu pregunta, en caso contrario puedes volver a comentarmelo.
Saludos
Permalink
me pasa que tengo una tabla de la cual borro registros asociados a otra tabla (facturas y detalles de facturas ). el problema es que me borra los detalles de una factura y cuando termina con esos empieza a borra de otra factura , como puedo solucionar esto?
Permalink
Para poder ayudarte mejor, mándame tu código info@escuelactec.com