O comportamento padrão do auto_increment no MySQL 5.1 e posterior irá "perder" os valores de autoincremento se o INSERT falhar. Ou seja, ele incrementa em 1 a cada vez, mas não desfaz um incremento se o INSERT falhar. É incomum perder ~ 750 valores, mas não impossível (consultei um site que estava pulando 1500 para cada INSERT bem-sucedido).
Você pode alterar
innodb_autoinc_lock_mode=0
para usar o comportamento do MySQL 5.0 e evitar a perda de valores em alguns casos. Consulte http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html
para mais detalhes. Outra coisa a verificar é o valor do
auto_increment_increment
variável de configuração. É 1 por padrão, mas você pode ter alterado isso. Novamente, é muito incomum configurá-lo para algo maior que 1 ou 2, mas é possível. Concordo com outros comentaristas, as colunas autoinc devem ser únicas, mas não necessariamente consecutivas. Você provavelmente não deve se preocupar tanto com isso, a menos que esteja avançando o valor de autoinc tão rapidamente que pode ficar fora do alcance de um INT (isso aconteceu comigo).
Como exatamente você corrigiu pulando 1500 para sempre inserir?
A causa da falha do INSERT foi que havia outra coluna com uma restrição UNIQUE e o INSERT estava tentando inserir valores duplicados nessa coluna. Leia a página de manual à qual vinculei para obter detalhes sobre por que isso é importante.
A correção foi fazer um SELECT primeiro para verificar a existência do valor antes de tentar INSERT. Isso vai contra a sabedoria comum, que é apenas tentar o INSERT e lidar com qualquer exceção de chave duplicada. Mas, neste caso, o efeito colateral do INSERT com falha causou a perda de um valor de auto-inc. Fazer um SELECT primeiro eliminou quase todas essas exceções.
Mas você também tem que lidar com uma possível exceção, mesmo se você SELECT primeiro. Você ainda tem uma condição de corrida.
Você tem razão! innodb_autoinc_lock_mode=0 funcionou como um encanto.
No seu caso, gostaria de saber por que tantas inserções estão falhando. Eu suspeito que, como muitos desenvolvedores SQL, você não está verificando o status de sucesso depois de fazer seus INSERTs em seu manipulador AJAX, então você nunca sabe que muitos deles estão falhando.
Eles provavelmente ainda estão falhando, você apenas não está perdendo ids de auto-inc como um efeito colateral. Você deve realmente diagnosticar por que ocorrem tantas falhas. Você pode estar gerando dados incompletos ou executando muito mais transações do que o necessário.