LAST_INSERT_ID () di MySQL
-
27-09-2019 - |
Domanda
Ho una domanda MySQL che penso dovrebbe essere abbastanza semplice. Ho bisogno di restituire l'Ultimi inseriti ID da table1 quando si esegue 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 si può capire il codice corrente sarà solo restituire l'ultimo INSERIRE ID di table2 invece di table1, come posso ottenere l'id da table1 anche se inserisco in table2 tra?
Soluzione
È possibile memorizzare l'ultimo inserto id 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);
o ottenere l'id max 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;
Altri suggerimenti
Dal momento che in realtà memorizzato il LAST_INSERT_ID precedente () nella seconda tabella, è possibile ottenere 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 tabelle differenti e crea un riferimento a entrambi i tavoli troppo.
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;
Ho avuto lo stesso problema in bash e che sto facendo qualcosa di simile:
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 funzionano. Perché dopo il primo comando, la shell verrà disconnesso dalla mysql e registrato nuovamente per il secondo comando, e quindi il @last_insert_id variabile non è impostata più. 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 di un bash: -)
Sarebbe possibile salvare la variabile last_id_in_table1 in una variabile php per utilizzarla in seguito?
Con questo last_id ho bisogno di collegare alcuni record in un altro tavolo con questo last_id, quindi ho bisogno di:
1) Fare un INSERT e ottenere il last_id_in_table1
INSERT into Table1(name) values ("AAA");
SET @last_id_in_table1 = LAST_INSERT_ID();
2) Per le righe indeterminated in un'altra tabella, AGGIORNAMENTO queste righe con il 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
}
Per nessuna soluzione InnoDB: è possibile utilizzare una procedura di
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 lo si può utilizzare ...
SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;
Per ultimo e il penultimo:
INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user ) );
Giusto per aggiungere per Rodrigo posto, invece di LAST_INSERT_ID () nella query è possibile utilizzare SELEZIONE MAX (id) FROM tabella1 ;, ma è necessario utilizzare (),
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 entra record, quindi eseguo la seguente query subito dopo l'inserto:
$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");
while ($row = $result->fetch_assoc()) {
$id = $row['id'];
}
Questa recupera l'ultimo id dal database.
Se avete bisogno di avere da MySQL, dopo la tua ricerca, l'ultimo id auto-incrementale, senza un'altra query, inserire nel codice:
mysql_insert_id();