Foros del Web » Programando para Internet » PHP »

mysql_insert_id VS LAST_INSERT_ID

Estas en el tema de mysql_insert_id VS LAST_INSERT_ID en el foro de PHP en Foros del Web. Buenas tardes con todos, Mi consulta es la siguiente: Tengo 1 tabla llamada PERSONAS con los siguientes campos: ID - INT (AUTO INCREMENTO) PRIMARY KEY ...
  #1 (permalink)  
Antiguo 21/03/2011, 16:49
Avatar de rfadgrmm  
Fecha de Ingreso: junio-2009
Mensajes: 74
Antigüedad: 15 años, 5 meses
Puntos: 1
Pregunta mysql_insert_id VS LAST_INSERT_ID

Buenas tardes con todos,

Mi consulta es la siguiente:

Tengo 1 tabla llamada PERSONAS con los siguientes campos:

ID - INT (AUTO INCREMENTO) PRIMARY KEY
Apellidos - VARCHAR
Nombres - VARCHAR


ID | Apellidos | Nombres
=================
1 | MENDOZA | RUBEN
2 | CABRERA | ELSA


Ahora, yo uso consultas de inserción simple:

INSERT INTO personas(Apellidos, Nombres) VALUES('ANYOSA', 'Lucila');

Y con mysql_insert_id() recupero el ID generado en mi tabla, hasta aquí está todo bien.


Ahora se me presenta este caso: Yo deseo hacer inserciones masivas de datos, para optimizar mis procesos en MySQL, tal como esto:

INSERT INTO personas(Apellidos, Nombres) VALUES ('DIAZ', 'Lourdes'), ('ARANA', 'José'), ('AREVALO', 'Cinthya'), ..., ('ANGELES', 'Aleeda');

Y necesito recuperar TODAS las ID's generadas, por que por ejemplo deseo crear una tabla de nombre CORREOS y aplico una relación de uno a varios (una persona puede tener muchos correos). Lo que deseo es recuperar todos los ID's desde 'DIAZ' hasta 'ANGELES', y no se como hacerlo exactamente.

Me dicen que puedo usar LAST_INSERT_ID(). Sin embargo no le encuentro diferencia con mysql_insert_id(). Quizá me esté equivocando; alguien que pueda explicarme y/o ilustrarme con un ejemplo, estaría muy agradecido.

También navegando por la Web, menciona que LAST_INSERT_ID() es más efectivo que mysql_insert_id() para lectura de campos del tipo BIGINT. Tengo otras tablas con ID autonumérico BIGINT, y quisiera también salir de esa duda. Esto más parece un tema de MySQL que de PHP, pero tienen ambos relación, todos los procesos los hago mediante código PHP.

Saludos,
__________________
"Viajando en el espacio profundo, de nova en nova, y sorteando a veces uno que otro agujero negro..." Peru@D
  #2 (permalink)  
Antiguo 21/03/2011, 19:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: mysql_insert_id VS LAST_INSERT_ID

lee el manual...
http://php.net/mysql_insert_id

ahí explica las diferencias, ¿sabías?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 22/03/2011, 14:26
Avatar de rfadgrmm  
Fecha de Ingreso: junio-2009
Mensajes: 74
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: mysql_insert_id VS LAST_INSERT_ID

Hola pateketrueke, se agradece la sugerencia del link, pero a veces los detalles técnicos en este enlace http://php.net/mysql_insert_id no son 100% entendibles, si es que no hay un pequeño y/o mínimo ejemplo de ejecución. Suelo consultar mucho las ayudas de PHP.net, pero a veces los ejemplos son algo confusos, es por eso que recurro a los foros para exponer algunas consultas y con detalles.

No pido que me resuelvan todo el problema, ni tampoco me estoy quejando por las sugerencias de este foro (que de hecho son todas bienvenidas y que en su totalidad fueron, son y serán útiles), pero pienso que con un ejemplo más práctico, uno aprende mejor, se nos prende el "foquito" de ideas y de paso dejar explicado en este post para futuros visitantes que tienen dudas como yo.

Saludos
__________________
"Viajando en el espacio profundo, de nova en nova, y sorteando a veces uno que otro agujero negro..." Peru@D
  #4 (permalink)  
Antiguo 22/03/2011, 14:38
Avatar de yeudiel  
Fecha de Ingreso: abril-2008
Ubicación: Ciudad de México
Mensajes: 78
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: mysql_insert_id VS LAST_INSERT_ID

A mi se me ocurre que pudieras recuperar el id al final de cada sentencia dentro de un while, talvez no sea tan ortodoxo como tu planeas, pero igual funciona. Algo como esto
Código PHP:
for(...){
$res=mysql(insert...) //inserta uno solo en personas
$ultimo=mysql_insert_id();
$res2=mysql(insert...) //insertas en la otra base de datos el $ultimo para relacionarlo con personas

  #5 (permalink)  
Antiguo 22/03/2011, 14:52
Avatar de rfadgrmm  
Fecha de Ingreso: junio-2009
Mensajes: 74
Antigüedad: 15 años, 5 meses
Puntos: 1
Sonrisa Respuesta: mysql_insert_id VS LAST_INSERT_ID

Hola yeudiel, gracias por tu respuesta. Para ello tendría que cambiar mi sentencia SQL (INSERT) al modo tradicional, es decir uno por uno. Lo que busco es (si en caso es posible o no), recuperar todos los ID's generados producto de una sentencia INSERT múltiple.

Actualmente lo estoy haciendo de modo tradicional (ingresando uno por uno y capturando el último ID generado), lo que pasa es que si hago mis sentencias SQL con INSERT masivo, gano un poco más de velocidad de escritura en mi base de datos.

Código PHP:
$sql "INSERT INTO personas(Apellidos, Nombres) VALUES ('DIAZ', 'Lourdes'), ('ARANA', 'José'), ('AREVALO', 'Cinthya'), ('ANGELES', 'Aleeda')";
mysql_query($sql$conx);
$ultimo mysql_insert_id();
//CAPTURA EL ULTIMO ID GENERADO, Y COMO PUEDO RECUPERAR EL RESTO??... 
Saludos
__________________
"Viajando en el espacio profundo, de nova en nova, y sorteando a veces uno que otro agujero negro..." Peru@D
  #6 (permalink)  
Antiguo 22/03/2011, 15:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: mysql_insert_id VS LAST_INSERT_ID

volviendo al tema:
Cita:
Note:

Because mysql_insert_id() acts on the last performed query, be sure to call mysql_insert_id() immediately after the query that generates the value.

Note:

The value of the MySQL SQL function LAST_INSERT_ID() always contains the most recently generated AUTO_INCREMENT value, and is not reset between queries.
es bien importante tener en cuenta todas las notas de la documentación, ya que por si mismas resuelven la pregunta inicial de tu tema: definitivamente es mejor mysql_insert_id()
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 22/03/2011, 15:53
Avatar de rfadgrmm  
Fecha de Ingreso: junio-2009
Mensajes: 74
Antigüedad: 15 años, 5 meses
Puntos: 1
Sonrisa Respuesta: mysql_insert_id VS LAST_INSERT_ID

Hola pateketrueke, gracias por la sugerencia. Como expliqué en mi último post, mysql_insert_id() funciona sobre el último ID generado, desde una sentencia SQL de inserción simple: (Suponiendo, si mi tabla PERSONAS tiene el auto incremento de valor 2)

Código PHP:
$sql "INSERT INTO personas(Apellidos, Nombres) VALUES ('DIAZ', 'Lourdes')";
mysql_query($sql$conx);
$ultimo mysql_insert_id();
//Me devuelve : 3 ... 
Hasta ahí realiza bien su función, capturo el ID siempre y cuando sea una inserción simple. Ahora para una consulta de inserción múltiple:

Código PHP:
$sql "INSERT INTO personas(Apellidos, Nombres) VALUES ('DIAZ', 'Lourdes'), ('ARANA', 'José'), ('AREVALO', 'Cinthya'), ('ANGELES', 'Aleeda')";
mysql_query($sql$conx);
$ultimo mysql_insert_id();
//Me devuelve: 6 ... 
En este ejemplo me devuelve 6, pero quisiera recuperar el resto (Es decir: 3, 4, 5), sin tener que recurrir a la consulta de inserción simple. (Es decir, uno por uno) Por ahora, mi programación tiene esa funcionalidad de uno por uno.

Si es posible, me gustaría alguna idea de como hacerlo, por ahora estoy desarrollando una alternativa que se acerque a lo que busco.

Nota: LAST_INSERT_ID() (MySQL) al parecer trabaja bien con ID's en campos del tipo BIGINT, ya que con mysql_insert_id() (API PHP) puede capturar ID's en campos que no superen el límite de un INT, ya que si lo sobrepasa lo transformaría en datos del tipo LONG, y pueden producirse errores al momento de buscar datos relacionados con el ID generado. Si alguien puede confirmar esta información, estaré muy agradecido.

Saludos
__________________
"Viajando en el espacio profundo, de nova en nova, y sorteando a veces uno que otro agujero negro..." Peru@D

Etiquetas: last_insert_id, mysql_insert_id
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:52.