Pregunta

Tengo una pregunta MySQL que creo que debe ser bastante fácil. Tengo que devolver el último registro insertado Identificación de tabla1 cuando corro la siguiente consulta de 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 el último INSERT Identificación de tabla2 en lugar de tabla1, ¿cómo puedo obtener el ID de la Tabla1 incluso si inserto en tabla2 entre?

¿Fue útil?

Solución

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 el máximo Identificación del FRM tabla1

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;   

Otros consejos

Dado que en realidad se almacenó 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();

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;

Yo tenía el mismo problema en bash y yo 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. Debido a que después de que el primer comando, la cáscara se registrará hacia fuera de MySQL y se conectó de nuevo para el segundo sistema y, a continuación, la variable @last_insert_id no se establece más. 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: -)

Sería posible salvar la variable last_id_in_table1 en una variable de PHP para usarlo más adelante?

Con esta last_id necesito adjuntar algunos registros de otra tabla con esta last_id, por eso es necesario:

1) hacer 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, la actualización de estas filas con el last_id_insert generada en el inserto.

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

Para obtener ninguna solución InnoDB: se puede utilizar un procedimiento de don't forgot to set the the delimiter for storing the procedure with ;

CREATE PROCEDURE myproc(OUT id INT, IN otherid INT, IN title VARCHAR(255))
BEGIN
LOCK TABLES `table1` WRITE;
INSERT INTO `table1` ( `title` ) VALUES ( @title ); 
SET @id = LAST_INSERT_ID();
UNLOCK TABLES;
INSERT INTO `table2` ( `parentid`, `otherid`, `userid` ) VALUES (@id, @otherid, 1); 
END

Y se puede usar ...

SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;

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  ) );

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)

Sólo tenemos una persona que entra en los registros, por lo que ejecutar la consulta siguiente 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 el último ID de la base de datos.

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top