MySQL: Inserindo registro e recuperando ID gerado
Abril 7, 2009
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:
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.
Agosto 11, 2009 at 5:36 pm
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′)”;