LAST_INSERT_ID () MySQL

Ho una domanda su MySQL che penso debba essere abbastanza facile. Devo restituire l’ULTIMO INSERTED ID da table1 quando eseguo la seguente query 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(); 

Come puoi capire, il codice corrente restituirà solo l’ID ULTIMO INSERIMENTO di table2 invece di table1, come posso ottenere l’id da table1 anche se inserisco in table2 tra?

È ansible memorizzare l’ultimo ID di inserimento in una variabile:

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

Oppure ottieni il massimo id frm table1

 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; 

Dal momento che hai effettivamente memorizzato il precedente LAST_INSERT_ID () nella seconda tabella, puoi ottenerlo da lì:

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

Ciò consente di inserire una riga in 2 diverse tabelle e crea anche un riferimento ad entrambe le tabelle.

 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; 

Sarebbe ansible salvare la variabile last_id_in_table1 in una variabile php per usarla in seguito?

Con questo ultimo_id ho bisogno di albind alcuni record in un’altra tabella con questo last_id, quindi ho bisogno di:

1) Fai un INSERISCI e ottieni l’ultimo_id_in_table1

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

2) Per le righe indeterminate in un’altra tabella, AGGIORNAMENTO di queste righe con last_id_insert generato nell’inserto.

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

Ho avuto lo stesso problema in bash e sto facendo qualcosa del genere:

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

che funziona bene 🙂 Ma

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

non lavorare Perché dopo il primo comando, la shell verrà disconnessa da mysql e loggata nuovamente per il secondo comando, e quindi la variabile @last_insert_id non sarà più impostata. La mia soluzione è:

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

Forse qualcuno è alla ricerca di una soluzione e una bash 🙂

Per nessuna soluzione InnoDB: è ansible utilizzare una procedura 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 

E puoi usarlo …

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

Per ultimo e penultimo:

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

Solo per aggiungere il post di Rodrigo, invece di LAST_INSERT_ID () nella query puoi usare SELECT MAX (id) FROM table1 ;, ma devi usare (),

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

Abbiamo solo una persona che registra i record, quindi eseguo la seguente query immediatamente dopo l’inserimento:

 $result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1"); while ($row = $result->fetch_assoc()) { $id = $row['id']; } 

Questo recupera l’ultimo id dal database.

Se è necessario avere da mysql, dopo la query, l’ultimo ID auto incrementale senza un’altra query, inserire il codice:

 mysql_insert_id();