Obtener el ultimo id del ultimo registro insertado

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.

Ejemplo con PHP y MySQL
$query= mysql_query("SELECT @@identity AS id");
 if ($row = mysql_fetch_row($query)) 
 {
   $id = trim($row[0]);
 }

 

Ejemplo con Visual Basic y SQL Server
command.CommandText = "SELECT @@identity AS id"
dt.TableName="nombre_de_la_tabla"
dt.Load(command.ExecuteReader)
id = dt.Rows(0).Item(0).ToString()

 

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.

Ejemplo con PHP y MySQL
$query= mysql_query("SELECT MAX(id_tabla) AS id FROM tabla");
 if ($row = mysql_fetch_row($query)) 
 {
   $id = trim($row[0]);
 }

 

Ejemplo con Visual Basic y SQL Server
command.CommandText = "SELECT MAX(id_tabla) FROM tabla"
dt.TableName="nombre_de_la_tabla"
dt.Load(command.ExecuteReader)
id = dt.Rows(0).Item(0).ToString()

 


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();

38 comentarios


  1. Excelente aporte, lo estaba buscando desde hace ya algunos días. Me han salvado…!!!
    Espero siga poniendo mas información de programación

    Responder

  2. 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.

    Responder

    1. 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.

      Responder

  3. estoy en Visual Basic y SQL Server pero no se como ago para mostrarlo el ultimo id en un texbox ……agradesco su respuesta..

    Responder

    1. 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!!!

      Responder

    2. 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

      Responder

      1. 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

        Responder

  4. 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

    Responder

    1. 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:
      Ejemplo

      Saludos, espero te sea útil.

      Responder

  5. completando la pregunta anterior “Como hago para el MAXid mostrarlo en un text para PHP y SQL , porsiacaso mi BD esta en postgres

    Responder

    1. Hola Ericka!!

      La forma de usar MAX(campo) seria la misma al usar PostgreSQL

      Responder

  6. nececito este scrip pero con la tabla en ceros

    Responder

    1. 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).

      Responder

  7. El MAX(id) funciona perfectamente con visual basic y acces, Gracias por el aporte.

    Responder

    1. Me alegra saber que te fue útil, no dejes de visitar nuestro canal de Youtube.com/escuelactec

      Responder

  8. 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!

    Responder

    1. 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

      Responder

  9. Hola,quisiera saber como puedo obtener el ultimo registro ingresado, o sea ademas del id, los otros campos correspondientes al registro. Gracias

    Responder

    1. 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

      Responder

  10. 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. 😀

    Responder

  11. lo resolvi de esta manera:

    select * from usuarios where ID_USUARIO= (select max(ID_USUARIO) from usuarios)

    Responder

  12. 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

    Responder

  13. 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.

    Responder

    1. 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

      Responder

  14. 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

    Responder

    1. Puedes usar la sentencia SELECT @@identity AS id, la cual se debe ejecutar inmediatamente después de realizar la inserción

      Responder

  15. 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?

    Responder

    1. 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.

      Responder

  16. 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?

    Responder

    1. 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

      Responder

  17. 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))

    Responder

    1. 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

      Responder

  18. 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?

    Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

cinco × 4 =