Um dos grandes problemas que costumo ver no MySQL é o seguinte: “Quero inserir um registro em uma tabela, recuperar o ID que foi gerado pelo AUTO_INCREMENT e inserir registros em outras tabelas.”
Vejo por aí muitas soluções,  algumas interessantes e outras grandes gambiarras.
Esqueça MAX() +1 , ORDER BY chave DESC LIMIT 1, SHOW TABLE STATUS, entre outros…

Segue abaixo uma das melhores formas para se fazer isso:

1 INSERT INTO tabela (chave_primaria, coluna1, coluna2) VALUES (null, aaa, bbb);
2 SELECT LAST_INSERT_ID() INTO @ID;
3 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, xxx, yyy);
4 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, www, zzz);
5 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, uuu, iiii);

Desta forma você tem 100% de eficiência na recuperação do ID, não tendo problemas em capturar um ID recém-inserido por outro usuário. Com LAST_INSERT_ID() você estará recuperando sempre o último ID gerado pela sua sessão.

Se você estiver usando INNODB engine, ainda pode trabalhar com transações adicionando os comandos START TRANSACTION e COMMIT para ter total integridade dos dados.

One Response to “MySQL: Inserindo registro e recuperando ID gerado”


  1. Sou novato em php e aind anaum entendo muito bem como as coisas funciona …fiz assim e num deu certo.

    $query = “INSERT INTO `cad` (`id`, `desc1`, `site`, `telefone`, `bairro`,`cidade`,`video`, `endereco`, `imagemlogo`, `palavras`, `tipo`, `data`, `disp`, `nivel`, `posicao`,`nome`, `email`, `categoria1`, `categoria2`, `categoria3`, `categoria4`, `categoria5`) VALUES (”, ‘$desc1′, ‘$site’, ‘$telefone’, ‘$bairro’,'$cidade’,'$video’,'$endereco’, ‘$imagemlogo’, ‘$palavras’, ‘$tipo’, ‘$dataconvertida’, ‘$disp’, ‘$nivel’, ‘posicao’,'$nome’, ‘$email’, ‘$categoria1′, ‘$categoria2′, ‘$categoria3′, ‘$categoria4′, ‘$categoria5′)”;

    $query = ” SELECT LAST_INSERT_ID() INTO `cad` @id “;

    $query = “INSERT INTO `cad_areas` (`id`,`cliente`, `nivel`, `categoria`) VALUES (”,’@id’, ‘$nivel’,'$categoria1′)”;


Leave a Reply