Existe alguma condição específica aonde o MySQL poderia retonar LAST_INSERT_ID errada ?
Está tudo como sempre foi, mas parece que eventualmente isso está ocorrendo.
Erro no MySQL (*)
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro no MySQL (*)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- clodoaldomonteiro
- Usuário Nível 4

- Mensagens: 821
- Registrado em: 30 Dez 2006 13:17
- Localização: Teresina-PI
- Contato:
Erro no MySQL (*)
No Postgres, no final da query de INSERT eu coloco "RETURNING codigo_acesso, id, ug_id;", daí vai me retornar um recordSet com os campos que pedi retorno, e assim posso ter os IDs inseridos.
Exemplo de uso:
Segundo o GPT:
Código: Selecionar todos
INSERT INTO pessoas (nome, email)
VALUES ('João da Silva', 'joao@email.com')
RETURNING id;
Código: Selecionar todos
cSQL := "INSERT INTO pessoas (nome, email) " + ;
"VALUES ('João da Silva', 'joao@email.com') " + ;
"RETURNING id"
oRs := oCn:Execute( cSQL )
nNovoID := oRs:Fields("id"):Value
PODE RETORNAR ERRADO OU INESPERADO QUANDO:
Múltiplas conexões (concorrência):
Se você usa LAST_INSERT_ID() em uma conexão diferente da que executou o INSERT, ele retornará 0 ou o último valor daquela conexão, e não o valor recém-inserido.
Solução: mantenha tudo na mesma conexão.
Nenhum valor AUTO_INCREMENT foi gerado:
Se o id foi explicitamente informado (ex: INSERT INTO ... (id, ...) VALUES (123, ...)), o LAST_INSERT_ID() pode não retornar esse valor, dependendo do contexto.
Triggers (gatilhos):
Se um TRIGGER fizer outro INSERT com AUTO_INCREMENT, pode sobrescrever o valor retornado por LAST_INSERT_ID() dependendo da lógica.
Função LAST_INSERT_ID() usada com argumento:
LAST_INSERT_ID(expr) define manualmente o valor que a função vai retornar:
SELECT LAST_INSERT_ID(100);
SELECT LAST_INSERT_ID(); -- retorna 100
Isso pode confundir se usado acidentalmente em bibliotecas ou procedures.
Tabelas com chave composta sem AUTO_INCREMENT:
Se a tabela não tem AUTO_INCREMENT, LAST_INSERT_ID() sempre retornará 0.
-Recomendações para segurança:
Use transações para garantir consistência se houver outras operações no meio.
Sempre chame LAST_INSERT_ID() imediatamente após o INSERT, sem comandos intermediários.
Evite usar em funções armazenadas que contenham múltiplos INSERTs.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Erro no MySQL (*)
Aí que está....
É esquisito...
É a mesma coisa de sempre, do mesmo jeito de sempre.
É esquisito...
É a mesma coisa de sempre, do mesmo jeito de sempre.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
Rafael Kappaun
- Usuário Nível 1

- Mensagens: 2
- Registrado em: 14 Mai 2025 15:10
- Localização: Petrópolis - RJ
Erro no MySQL (*)
Boa Tarde José.
Sim, existem algumas situações específicas em que o LAST_INSERT_ID() pode retornar um valor inesperado ou "errado", mesmo que o comportamento da aplicação aparentemente não tenha mudado.
O LAST_INSERT_ID() é específico por conexão. Se, por algum motivo, duas operações de inserção ocorrem na mesma conexão, mas em pontos diferentes do código, você pode acabar pegando o ID de outra inserção anterior na mesma sessão.
Solução: Sempre chame LAST_INSERT_ID() imediatamente após o INSERT, na mesma transação lógica, e evite compartilhar conexões de forma concorrente (especialmente em ambientes multithread).
Em alguns drivers (especialmente ADO, ODBC ou conectores mais antigos), LAST_INSERT_ID() pode se comportar de forma inconsistente se a propriedade Execute/CommandType não estiver corretamente definida
Espero que ajude
Até
Rafael Kappaun
Sim, existem algumas situações específicas em que o LAST_INSERT_ID() pode retornar um valor inesperado ou "errado", mesmo que o comportamento da aplicação aparentemente não tenha mudado.
O LAST_INSERT_ID() é específico por conexão. Se, por algum motivo, duas operações de inserção ocorrem na mesma conexão, mas em pontos diferentes do código, você pode acabar pegando o ID de outra inserção anterior na mesma sessão.
Solução: Sempre chame LAST_INSERT_ID() imediatamente após o INSERT, na mesma transação lógica, e evite compartilhar conexões de forma concorrente (especialmente em ambientes multithread).
Em alguns drivers (especialmente ADO, ODBC ou conectores mais antigos), LAST_INSERT_ID() pode se comportar de forma inconsistente se a propriedade Execute/CommandType não estiver corretamente definida
Espero que ajude
Até
Rafael Kappaun