3 formas de obtener el id del ultimo registro en mysql y php (SQL)

La idea en de este tip es recuperar el id de la ultima insercion realizada en una tabla, para poder realizar estas operaciones se requiere que el indice sea un campo auto-increment y en teoria deberia funcionar en cualquier base de datos dado por ser sintaxis SQL, sin embargo yo solo las he podido probar en MySQL.

@@identity

Este es posiblemente el metodo mas conocido, consiste en utilizar la sintaxis “SELECT @@identity AS id” este metodo funciona tanto en MySQL como en SQL SERVER y devuelve el id del ultimo ingreso por lo que se lo utiliza a continuacion de la sentencia INSERT.

$rs = mysql_query("SELECT @@identity AS id");
if ($row = mysql_fetch_row($rs)) {
$id = trim($row[0]);
}

MAX(id)

Otra forma de obtener el ultimo id es mediante la sentencia “SELECT MAX(id) AS id FROM tabla”, recordando que solo funciona en campos con la propiedad auto-increment. La ventaja de este metodo con respecto al anterior es que puede ser utilizado incluso si se han realizado otras inserciones a otras tablas, si se ha reiniciado el computador, etc;  ya que este metodo busca el id de mayor valor dentro de la tabla y como es auto incrementable el mayor siempre sera el ultimo. Es muy util si vas a recuperar el ultimo id en cualquier momento y no solo despues de insertarlo.

$rs = mysql_query("SELECT MAX(id_tabla) AS id FROM tabla");
if ($row = mysql_fetch_row($rs)) {
$id = trim($row[0]);
}

mysql_insert_id

Por ultimo, si estas trabajando en php y mysql es posible que conozcas esta funcion 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. Tambien es posible utilizarla en SQL SERVER a traves de la funcion mssql_insert_id().

$id=mysql_insert_id();

por el momento he confirmado que las tres opciones funcionan perfectamente con mysql y php, y referencias de que funcionan igualmente en SQL SERVER. Como bono para la gente que desarrolla en SQL SERVER les enlazo a este sitio donde tenemos una pequena muestra de como utilizar la funcion Scope_identity() que trabaja de forma similar a los metodos vistos arriba.

Anuncios

40 comentarios en “3 formas de obtener el id del ultimo registro en mysql y php (SQL)

  1. Hago mi aporte:

    Con esto se puede obtener el próximo Id a insertar en una tabla con un campo auto_increment y por mas que se borren registros jamás se usaran números iguales.

    Esto es informacion del esquema de la base:

    $SqlString = “SELECT AUTO_INCREMENT AS LastId FROM information_schema.tables WHERE TABLE_SCHEMA=’$Nombre_mi_base_de_Datos’ AND TABLE_NAME=’$nombre_mi_tabla'”;

    steeben

  2. es cierto, aunque es riesgoso cuando el auto-increment es primary-key y le seteas un valor mayor al ultimo que fue generado por el campo, por que en el momento que el auto-increment alcance dicho numero, devolvera un mensaje de error que dice que el registro esta duplicado y no lo ingresa.

  3. Hola, muy interesante post, oye una preguntota, crees que esas maneras las pueda utilizar en visual basic.net, o sabes donde puedo encontrar referencias acerca de este tema, gracias de antemano…

    • las dos primeras formas @@identity y MAX(id) son funciones de MySQL y te sirven independientemente del lenguaje que uses para realizar la consulta. mysql_insert_id() es una funcion propia del modulo de conexion de mysql en php por lo que no funcionara en visual basic.net, imagino que debe de haber alguna funcion similar pero la verdad yo no uso .net 😦

      • Buenas tardes te dejo un ejemplo, debes crear un procedimiento almacenado que realiza el INSERT y el te devuelve el Id

        SELIMITER $$
        USE `base_datos`$$

        DROP PROCEDURE IF EXISTS `SP_Ing_Datos`$$

        CREATE DEFINER=`root`@`%` PROCEDURE `SP_Ing_Causas`( IN m_Rol INTEGER(10) ,
        IN m_RolAnno INTEGER(10) )

        BEGIN
        DECLARE NumeroId INTEGER(10);

        INSERT INTO Jur_Causas( Nr_Rol ,
        Nr_RolAnno )
        VALUES( m_Rol ,
        m_RolAnno );

        SET NumeroId=LAST_INSERT_ID();

        SELECT NumeroId;

        END$$

        DELIMITER ;

        Con .Net invocas este procedimiento y luego recibes el Id que se generó para el insert….

        Es de esperar te sirva…

      • muchas gracias por tu contribución, justamente estaba pensando en LAST_INSERT_ID() para una respuesta que estaba escribiendo 🙂

  4. asta el perro no sierve en sentencias SQL server … si pudieran seria bueno k pongan algo con procedimientos o solo en sentencia para visual

  5. yo tengo unas dudas.. yo tengo el campo q se autoincremente y con los codigo que pusiste el lo guarda pero yo lo que necesito es q me guarde el numero es decir si la tabla va por el 50 necesito que me lo guarde en una variable para poder ponerlo en otra tabla q hace referencia a la q se autoincremente.. por favor ayudenme

  6. Muy buen aporte, me ayudó bastante pero tengo algunas dudas de cómo implementarlo en mi caso, mi problema es el siguiente y ojalá y me ayudaran, espero ser lo más claro posible:

    deseo registrar 2 datos con un Form (a base de PHP) en y a la vez:
    – primeramente en una tabla (“lista_molde” con 3 columnas (id, opcion, codmaq), el id es auto_inc)
    – y que a la vez se registre automáticamente el id del registro que hice en la primer tabla (“lista_molde”) junto con un dato de los 2 primeros en otra tabla (“informacion” con 4 columnas (idinf, codmaq, codmol, a))

    gráficamente sería así:

    tabla1: lista_molde
    id / opcion / codmaq
    “” / $newmol / $maq <—-registros

    tabla2: informacion
    idinf / codmaq/ codmol / a
    "" / $maq / "EL ID DE LA TABLA1" / "x" <—–registros

    ————————————————-
    CÓDIGO:

    $instruccion = " INSERT INTO lista_molde (opcion, codmaq)
    values ('$newmol', '$maq')";

    /* el registro en la tabla1 sale a la perfección pero lo después ya no, ja */

    de antemano gracias y ojalá puedan ayudarme
    Saludos!

    • Puedes usar cualquiera de los tres metodos, aunque en este caso usare el tercero:

      //Ingreso el primer registro
      $instruccion = ” INSERT INTO lista_molde (opcion, codmaq) values (‘$newmol’, ‘$maq’)”;
      mysql_query($instruccion);

      //Obtengo el id
      $id=mysql_insert_id();

      //Ingreso el segundo registro
      $instruccion = ” INSERT INTO informacion (codmaq,codmol,a) values (‘$maq’, ‘$id’,$el_otro_campo)”;
      mysql_query($instruccion);

  7. $rs = mysql_query(“SELECT @@identity AS id”);
    if ($row = mysql_fetch_row($rs))
    {
    $id_usuario = trim($row[0]);
    }

    $datospersonales_nombre2=$_POST[“nombre”];
    $datospersonales_apellido=$_POST[“apellido”];
    $datospersonales_direccion=$_POST[“direccion”];

    $sql_usuariop=”insert into datos_personales
    (nombre,apellido,direccion) values ($id_usuario,’$datospersonales_nombre2′,’$datospersonales_apellido’,’$datospersonales_direccion’)”;

    como pondria el $id_usuario en la parte del insert into, porque me marca error.
    column count doesn’t match value count at row 1

    • $sql_usuariop=”insert into datos_personales ( XXXXX , nombre,apellido,direccion) values ($id_usuario,’$datospersonales_nombre2′,’$datospersonales_apellido’,’$datospersonales_direccion’)”

      solo tienes que reemplazar XXXXX con el nombre del campo donde vas a guardar el id.

  8. @@identity refiere al último Id de alguna tabla, en cambio Scope_identity(), el es último Id de la Tabla en que me encuentro trabajando. Cuidado pero puede confundir…

  9. MAX(id), efectiva para averiguar el consecutivo por ejemplo para facturación o cualquier operación similar. Excelente aporte. Muchas Gracias!

  10. Mi duda es la siguiente, necesito hacer dos transacciones un insert y tras esto inmediatamente un consulta a la tabla insertada en un segundo form, que me muestre los datos insertados. Sucede que en la web pueden muchos insertar datos casi al mismo tiempo, si recupero el ultimo ID de esa tabla no recuperaré la ultima que yo inserte si no la de otro usuario. Como puedo hacer esto? con un ejemplo me ayudarían

    • Hace algunos años el problema de concurrencia ocasionaba que este tipo de funciones no fueran tan seguras de usar. Actualmente son bastantes seguras al trabajar directamente sobre la conexión del usuario, de esa forma cuando ejecutas mysql_insert_id() solo te devuelve el ultimo id de la inserción realizada por ese usuario, siempre y cuando lo ejecutes inmediatamente despues de realizar dicha inserción.

    • Saludos, gracias si encontré la solución tal como me indicaron a través de un mail, haciendo un procedimiento almacenado y en ella una query que condiciona el usuario y un campo fecha tipo timestamp con un order by desc. Así cada usuario al insertar los datos puede ver inmediatamente su última información ingresada a la data.

  11. Soy nuevo en esto de PHP. Creo que las ayudas aquí son muy buenas. Estoy trabado con una situación, en un primer form yo mando insertar un registro y genera automaticamente e incremental el ID, sin embargo no se cargan aun todos los datos del registro sino posterior. Necesito obtener ese id que se acaba de generar, y con el usarlo en el siguiente form pero para terminar de agregar campos al registro con el UPDATE. De todo lo que he visto en internet, creo que lo que aquí plantean es lo que mas se acerca…ahora y agracería mucho es EL COMO hacerlo. Alguien podría ayudarme

    • Hola, existen varias formas de hacerlo. El concepto base de todas es el siguiente:

      • presentar el primer formulario
      • grabar los primeros datos y obtener el id de registro
      • presentar el segundo formulario incluyendo el id de registro
      • actualizar el registro con los datos del segundo formulario

      la manera mas sencilla de hacerlo sería obteniendo el id del registro y pasandolo como parámetro al segundo formulario, algo como:

      /*
      * cualquier código para grabar los datos
      * del primer formulario.
      *
      */
      $id_registro=mysql_insert_id();

      header('Location: segundo_formulario.php?id_registro='.$id_registro);
      exit();

      y en el archivo segundo_formulario.php recoges el id_registro y lo envias como variable oculta dentro del segundo formulario para que al procesar los datos sepas que registro actualizar.

  12. $registro= mysql_query(“SELECT TOP 1 * FROM programacion WHERE idcli = ‘$id’ AND estado=” “);

    ESTA CONSULTA ME DA ERROR PRETENDO CONSEGUIR EL PRIMER REGISTRO DE UNA CONSULTA CON CIERTAS CONDICIONES COMO PLATEO CUAL SERA EL PROBLEMA? GRACIAS

    • TOP 1 es en Sql Seerver aca en MySQL es asi:
      $registro= mysql_query(“SELECT * FROM programacion WHERE idcli = ‘$id’ AND estado=” “ limit 1;

      espero te haya servido, puedes dar un order by antes de limit 1…..

      • Te recomiendo usar PDO para la persistencia y en el motor utilizar procedimientos almacenados….

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s