Ver Mensaje Individual
  #9 (permalink)  
Antiguo 18/01/2006, 21:11
califa010
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
En los comentarios de usuarios a la función mysql_insert_id() (http://ar.php.net/mysql_insert_id), alguien comenta sobre este tema citando el manual de MySql.

Cita:
Here's the relevant quote from the manual on LAST_INSERT_ID() which is located here: http://dev.mysql.com/doc/mysql/en/In...functions.html

"The last ID that was generated is maintained in the server on a per-connection basis. This means the value the function returns to a given client is the most recent AUTO_INCREMENT value generated by that client. The value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that you can retrieve your own ID without concern for the activity of other clients, and without the need for locks or transactions."
O sea que la función (de MySql, no de php) LAST_INSERT_ID() devuelve siempre el último valor de id del insert realizado en el servidor por el cliente (el que hace la operación). Si dos personas insertan dos registros casi simultáneamente, no hay conflicto, porque son dos clientes distintos. A cada uno le va a devolver el id de su consulta. (Al menos así dice el manual)

Esta referencia de arriba corresponde a MySql 5, pero busqué en otras versiones y la función LAST_INSERT_ID() también está disponible. Lo que no está del todo claro es si la función de php mysql_insert_id() se comporta también así. (Me da la impresión de que no necesariamente, por algo MySql Server debe tener mysql_insert_id() y también LAST_INSERT_ID() )

En el manual hay algunos ejemplos que explican cómo usar LAST_INSERT_ID():

Código PHP:
$ultimo_id mysql_query("SELECT LAST_INSERT_ID()"); 
Así se almacenaría en una variable (suponiendo que antes hubiera efectivamente un insert).

Otra opción, del manual de MySql: (http://dev.mysql.com/doc/refman/4.1/...unique-id.html)

Código PHP:
INSERT INTO foo (auto,text)
    
VALUES(NULL,'text');              # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    
VALUES(LAST_INSERT_ID(),'text');  # use ID in second table 
El primer insert genera un id autonumérico, cuyo valor se usa en el segundo insert usando la función MySql LAST_INSERT_ID().

Creo que sería cuestión de empezar a hacer algunos tests con LAST_INSERT_ID(), que parece más "segura".