Página 1 de 1

Erro no MySQL (*)

Enviado: 06 Mai 2025 10:56
por JoséQuintas
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 (*)

Enviado: 09 Mai 2025 13:24
por clodoaldomonteiro
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.

Código: Selecionar todos

INSERT INTO pessoas (nome, email)
VALUES ('João da Silva', 'joao@email.com')
RETURNING id;
Exemplo de uso:

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
Segundo o GPT:
⚠️ 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.

Erro no MySQL (*)

Enviado: 09 Mai 2025 19:04
por JoséQuintas
Aí que está....
É esquisito...
É a mesma coisa de sempre, do mesmo jeito de sempre.

Erro no MySQL (*)

Enviado: 14 Mai 2025 15:16
por Rafael Kappaun
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