Tuesday 26 August 2008

En PHP recuperar el ultimo ID de un INSERT MySQL

Programando en PHP, ¿alguna vez has necesitado saber el valor generado para un ID autoincremental después de una consulta tipo INSERT? ¿eres de los que -como yo- se ha complicado la vida haciendo una consulta SELECT para encontrar el id más alto en esa tabla o el max(ID)? Pues anota la siguiente instrucción ;)

Te pondré un simple ejemplo de 3 líneas, y verás qué sencillo: supongamos que tienes una tabla llamada 'mi_tabla1' que tiene un campo ID de tipo AUTO_INCREMENT, y necesitas insertar un registro y luego saber inmediatamente cuál es el ID que se ha generado para él, con tal de poder aprovecharlo en otras tablas.

Veamos esas 3 líneas de código:

mysql_query("INSERT mi_tabla1 SET `mi_campo`='mi_valor'");
$ultimo_ID = mysql_insert_id();
mysql_query("INSERT mi_tabla2 SET `id1`='".$ultimo_ID."'");


Breve explicación: en la primera línea insertamos un nuevo registro en la tabla 'mi_tabla1'. En la segunda línea recuperamos CON UNA SOLA INSTRUCCIÓN el último valor "autogenerado" (tiene que haber un campo AUTO_INCREMENT en esa tabla) por la última inserción realizada en la conexión MySQL establecida por el script en ejecución. En la tercera línea utilizamos ese valor para añadir un nuevo registro con ese ID asociado a un campo que esta vez no será AUTO_INCREMENT, pero que permitirá relacionar los registros de ambas tablas.

Cómo habréis notado, el quit de la cuestión está en la función de PHP mysql_insert_id().

14 comments:

  1. El problema con esta funcion es que devuelve el ultimo id insertado durante ese proceso (si mal no recuerdo) y si hay otros procesos ejecutandose a la vez puede ser que el dato no sea autentico. Este problema se aplica la la funcion de mysql LAST_INSERT_ID, para mysql 4. Lo leí en un libro llamado la Biblia de Mysql. Imagino que esta funcion php trabaja sobre este valor del servidor Mysql, si alguien tiene mas detalles o esta seguro de que me equivoco por favor corrijame y le estare agradecido pues yo uso MAX en lugar de LAST_INSERT_ID para averiguar el mayor ID insertado de una tabla.

    ReplyDelete
  2. @ivan: creo que tienes toda la razón y creo que haces bien en diferenciar lo que yo explico de lo que tú buscas. Es cierto que son dos cosas parecidas pero diferentes:

    - en un mismo script primero haces un insert y luego deseas saber el valor del ID autonumérico generado "POR LA INSERCIÓN QUE ACABAS DE HACER", por ejemplo para utilizarlo para relacionar esa registro recién insertado con otro en otra tabla.

    - en cambio es diferente el caso de que tu en un momento dado quieras saber el último ID insertado, independientemente de que haya sido por tu script o por otro, o por una segunda ejecución de tu script.

    Son dos situaciones y dos necesidades bien diferentes. Gracias por mencionarlo.

    A falta de hacer más pruebas, yo tengo entendido que la función de PHP "mysql_insert_id()" sirve para el primero de los casos: recuperar el ultimo ID generado POR TU SCRIPT EN EJECUCIÓN !

    sergi

    ReplyDelete
  3. Gracias :), lo que dije antes en realidad no tenia mucho sentido pero se entendio la idea, tu tienes razon. Estuve averiguando y encontre esto
    que me parece bastante facil de entender y hace notar las diferencias entre ambas.

    ReplyDelete
  4. Yo crei haber creido lo que creias creer pero creo que fui un incredulo ;P.

    Grax por el Aporte :P

    ReplyDelete
  5. Una masa, me re salvaste,
    un abrazo!

    ReplyDelete
  6. Gracias!!!!!!!!!!!!!!!!! He estado al borde del suicidio toda la noche

    ReplyDelete
  7. Sos seco... muchas muchas gracias!

    ReplyDelete
  8. Gracias man , me salvaste ya estaba empezando a amarrar la soga al arbol, estaba apunto de colgarme =)!!!!

    Atte: Conde!!!

    ReplyDelete
  9. Hola este es un gran aporte pero tengo una duda ,tengo dos tablas "Declaracion" e "Ingresos", de la tabla Declaracion ya obtengo el valor de id de ultimo registro agregado esto en el script que me guarda los datos de Declaracion, de que manera puedo guardar este dato pero en la tabla Ingresos al ejecutar su escript...agradesco su ayuda.

    Atentamente: Bere

    ReplyDelete
  10. No entiendo muy bien tu pregunta Bere, pero intuyo que se te escapó algo: el comando mysql_insert_id() debe ejecutarse INMEDIATAMENTE después del INSERT. No hace falta que sea en la siguiente línea, pero sí que ha de ser EN EL MISMO "HILO" (o llamada PHP).

    Además, si haces dos inserciones seguidas y luego llamas a la función solo obtienes el ID de la última inserción, el otro ya no lo puedes conseguir.

    Hay otros métodos más "caseros" para obtener el último ID: puedes hacer una consulta ordenando por ID DESC con LIMIT 0,1 y así obtienes el último registro, algo como esto:

    SELECT * FROM noticias ORDER by id_not DESC limit 0,1

    y luego ya le ves el "id_not" ;)

    Saludos!
    SERGI

    ReplyDelete
  11. Muchas Gracias Sergi ...soy nueva en esto de php y mysql, disculpa por tanta molestia jeje..
    mira yo realizo la sig. consulta:

    $Clave_Tipo=mysql_query("SELECT Clv_Decla FROM declaracion WHERE Folio ='$row[Folio]' ORDER BY Clv_Decla LIMIT 0,1",$conexion);

    Me gustaría saber :
    1. si la sentencia anterior es correcta...

    Muchas gracias por tiempo...


    2 y si es correcta como pasar el resultado a una variable y despues imprimirla?
    Bere :)

    ReplyDelete
  12. Bueno, la instrucción SQL que pones parece correcta.

    En cuanto al punto 2, te recomiendo que mires el "example #2" de esta página:

    http://php.net/manual/es/function.mysql-query.php

    en mis casi 10 años programando con PHP esta web (php.net) ha sido fundamental para responder preguntas concretas y encontrar incluso muy buenos ejemplos! te la recomiendo.

    Aunque mi manera habitual de buscar algo es usar Google y pulsar sobre el primer enlace que vea del site php.net (curiosamente así encuentro más fácilmente lo que necesito, jejeje).

    Suerte y bienvenida al PHP, verás que la comunidad de PHP no solo es amplísima sino que también es propensa a ayudar al "vecino". Aquí la mayoría hemos empezado así.

    Un saludo!
    SERGI

    PD: por cierto, la web oficial de MySQL es bastante más confusa que la de PHP, pero es útil de vez en cuando:

    http://dev.mysql.com/doc/refman/5.0/es/select.html

    ReplyDelete
  13. Muchas gracias por tu ayuda SERGI, me ha servido bastante, ahora vengo con otra duda quizá no sea el lugar adecuado pero en verdad me urge mira:

    Realizó la siguiente consulta:

    $Total_bm= mysql_query("SELECT SUM(Valor) AS total_bm FROM datosgrales,bienesmuebles WHERE datosgrales.Folio=bienesmuebles.Folio AND User='$usuario'AND Clv_decla='$id_cv' ",$conexion);

    $row= mysql_fetch_array($Total_bm);

    $TotalBM = $row[total_bm];

    echo "$TotalBM";



    Como ejemplo estos valores son los que se tendrian que sumar

    300
    78
    200
    200

    Sin embargo me suma los 3 primeros y el ultimo no es decir el resultado me arroja 578, y hasta que agrego otro número a esta lista me suma el número anterior:

    300
    78
    200
    200
    100

    Ahora el resultado es: 778

    No me suma el valor de 100, que es lo que me esta fallando :(. Por tu ayuda GRACIAS

    atte Bere

    ReplyDelete
  14. WOW!!! excelente...eres mi heroe!!!

    ReplyDelete