Last_insert_id () mysql
-
27-09-2019 - |
Pergunta
Eu tenho uma pergunta mySQL que acho que deve ser muito fácil. Preciso devolver o último ID inserido da Tabela1 quando executar a seguinte consulta 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 você pode entender, o código atual retornará o último ID de inserção da Tabela 2 em vez da Tabela1, como posso obter o ID da Tabela1, mesmo que eu insira a Tabela 2 entre?
Solução
Você pode armazenar o último ID de inserção em uma variável:
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);
Ou obtenha o max id frm tabela1
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;
Outras dicas
Como você realmente armazenou o último last_insert_id () na segunda tabela, você pode obtê -lo a partir daí:
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();
Isso permite que você insira uma linha em duas tabelas diferentes e cria uma referência às duas tabelas também.
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;
Eu tive o mesmo problema em Bash e estou fazendo algo assim:
mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');"
que funciona bem :-) mas
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);"
Não funcione. Porque após o primeiro comando, o shell será logado no MySQL e logado novamente para o segundo comando e, em seguida, a variável @last_insert_id não está mais definida. Minha solução é:
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});"
Talvez alguém esteja procurando por uma solução uma festa :-)
Seria possível salvar a variável last_id_in_table1 em uma variável PHP para usá -la mais tarde?
Com este último_ID, preciso anexar alguns registros em outra tabela com este último_id, então eu preciso:
1) Faça uma inserção e obtenha o último_ID_IN_TABLE1
INSERT into Table1(name) values ("AAA");
SET @last_id_in_table1 = LAST_INSERT_ID();
2) Para quaisquer linhas indeterminadas em outra tabela, atualizando essas linhas com o último_ID_INSERT gerado na inserção.
$element = array(some ids)
foreach ($element as $e){
UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e
}
Para nenhuma solução InnoDB: você pode usar um procedimentodon'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 você pode usá -lo ...
SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;
Para o último e o segundo último:
INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user ) );
Apenas para adicionar para o post Rodrigo, em vez de last_insert_id () na consulta, você pode usar o Selecionar Max (id) da Tabela1;, mas você deve usar (),
INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)
Temos apenas uma pessoa inserindo registros, então executo a seguinte consulta imediatamente após a inserção:
$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");
while ($row = $result->fetch_assoc()) {
$id = $row['id'];
}
Isso recupera o último ID do banco de dados.
Se você precisar ter do MySQL, após sua consulta, o último ID automático sem outra consulta, coloque seu código:
mysql_insert_id();