2010-10-01 16 views
102

Tengo una pregunta de MySQL que creo que debe ser bastante fácil. Tengo que devolver el último registro insertado Identificación de tabla1 cuando corro el siguiente MySQL Query:LAST_INSERT_ID() MySQL

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1); 
SELECT LAST_INSERT_ID(); 

Como se puede entender el código actual se acaba de devolver la ID INSERT ÚLTIMO de tabla2 en lugar de tabla1, ¿cómo puedo obtener el id de la tabla 1 incluso si inserto en la tabla 2 entre?

Respuesta

178

Se puede almacenar el último ID de inserción en una variable:

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
SET @last_id_in_table1 = LAST_INSERT_ID(); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (@last_id_in_table1, 4, 1);  

O conseguir la tabla1 frm máximo Identificación del

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(), 4, 1); 
SELECT MAX(id) FROM table1; 
+4

Gracias! No lo pude hacer funcionar primero porque estaba usando asp.net con MySQL y necesitaba agregar Permitir Variables de Usuario = Verdadero a la Cadena de Conexión para permitir variables. – Martin

+82

max no es una buena idea, ya que podría perder una carrera con otro insertador. –

+2

@RobStarling Estoy totalmente de acuerdo, pero en caso de que alguien lo necesite absolutamente; use una transacción con el nivel de aislamiento adecuado. – Aidiakapi

10

Esto le permite insertar una fila en 2 mesas diferentes y crea una referencia a ambas tablas también.

START TRANSACTION; 
INSERT INTO accounttable(account_username) 
    VALUES('AnAccountName'); 
INSERT INTO profiletable(profile_account_id) 
    VALUES ((SELECT account_id FROM accounttable WHERE account_username='AnAccountName')); 
    SET @profile_id = LAST_INSERT_ID(); 
UPDATE accounttable SET `account_profile_id` = @profile_id; 
COMMIT; 
+1

Buena oportunidad en la transacción. –

-9

Si es necesario tener de MySQL, después de la consulta, la última identificación de auto-incrementales sin otra consulta, poner en su código:

mysql_insert_id(); 
+15

No recomiendo mysql_ * - que están en desuso –

+0

[cletus] (http://stackoverflow.com/users/18393/cletus) obtuvieron 106 votaciones ascendentes y respuesta marcada para ** mysql_insert_id ** aquí: http: // stackoverflow. com/a/897361/153923 – jp2code

+2

cletus lo respondieron en 2009! mysql está en desuso para usar mysqli y mysqli_insert_id http://ie2.php.net/mysqli_insert_id –

14

Ya que realmente se almacena el LAST_INSERT_ID anterior() en la segunda tabla, se puede obtener a partir de ahí:

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1); 
SELECT parentid FROM table2 WHERE id = LAST_INSERT_ID(); 
-1

Por último y penúltimo:

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user )); 
+0

Esta solución no es segura fuera de una transacción (es decir, autocommit habilitado) y dentro de una transacción con un nivel de aislamiento de transacción por debajo de serializable. Ver: https://en.wikipedia.org/wiki/Isolation_(database_systems) – snorbi

-1

Sólo para añadir a Rodrigo puesto, en lugar de LAST_INSERT_ID() en la consulta puede utilizar SELECT MAX (id) de la Tabla1 ;, pero debe utilizar(),

INSERT INTO table1 (title,userid) VALUES ('test', 1) 
INSERT INTO table2 (parentid,otherid,userid) VALUES ((SELECT MAX(id) FROM table1), 4, 1) 
+0

Esta solución no es segura fuera de una transacción (es decir, habilitado para autocommitir) y dentro de una transacción con un nivel de aislamiento de transacción por debajo de serializable. Ver: https://en.wikipedia.org/wiki/Isolation_(database_systems) – snorbi

-2

solamente tenemos una persona que entra registros, entonces ejecuto la siguiente consulta inmediatamente después de la inserción:

$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1"); 

while ($row = $result->fetch_assoc()) { 

      $id = $row['id']; 

} 

Esto recupera la última identificación de la base de datos.

+1

Tuve que dar un ejemplo válido, así que usé el que uso. Si lo hubiera hecho en C, probablemente se habría quejado "no todos usan C" ... – sspence65

0

¿Sería posible guardar la variable last_id_in_table1 en una variable php para usarla más tarde?

Con esta last_id necesito adjuntar algunos registros de otra tabla con esta last_id, así que necesito:

1) Haz un INSERT y obtener el last_id_in_table1

INSERT into Table1(name) values ("AAA"); 
SET @last_id_in_table1 = LAST_INSERT_ID(); 

2) Para cualquier filas indeterminados en otra tabla, ACTUALIZAR estas filas con last_id_insert generado en la inserción.

$element = array(some ids)  
foreach ($element as $e){ 
     UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e 
    } 
0

que tenían el mismo problema en bash y estoy haciendo algo como esto:

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');" 

que funciona muy bien :-) Pero

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');set @last_insert_id = LAST_INSERT_ID();" 
mysql -D "dbname" -e "insert into table2 (id_tab1) values (@last_insert_id);" 

no funcionan.Porque después del primer comando, el shell se cerrará la sesión de mysql y se registrará de nuevo para el segundo comando, y luego la variable @last_insert_id ya no se establece. Mi solución es:

lastinsertid=$(mysql -B -N -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');select LAST_INSERT_ID();") 
mysql -D "dbname" -e "insert into table2 (id_tab1) values (${lastinsertid});" 

Tal vez alguien está buscando una solución de una fiesta :-)

Cuestiones relacionadas