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."'");
$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().
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@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:
ReplyDelete- 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
Gracias :), lo que dije antes en realidad no tenia mucho sentido pero se entendio la idea, tu tienes razon. Estuve averiguando y encontre esto
ReplyDeleteque me parece bastante facil de entender y hace notar las diferencias entre ambas.
Yo crei haber creido lo que creias creer pero creo que fui un incredulo ;P.
ReplyDeleteGrax por el Aporte :P
Una masa, me re salvaste,
ReplyDeleteun abrazo!
Gracias!!!!!!!!!!!!!!!!! He estado al borde del suicidio toda la noche
ReplyDeleteSos seco... muchas muchas gracias!
ReplyDeleteGracias man , me salvaste ya estaba empezando a amarrar la soga al arbol, estaba apunto de colgarme =)!!!!
ReplyDeleteAtte: Conde!!!
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.
ReplyDeleteAtentamente: Bere
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).
ReplyDeleteAdemá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
Muchas Gracias Sergi ...soy nueva en esto de php y mysql, disculpa por tanta molestia jeje..
ReplyDeletemira 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 :)
Bueno, la instrucción SQL que pones parece correcta.
ReplyDeleteEn 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
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:
ReplyDeleteRealizó 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
WOW!!! excelente...eres mi heroe!!!
ReplyDelete