Li recentemente que, devido ao modo como o InnoDB recalcula o valor AUTO_INCREMENT quando o servidor é reiniciado, qualquer registro na parte alta da lista de IDs pode ter seus IDs reutilizados.
Normalmente, isso não é um problema, porque quando um usuário é excluído, tudo associado ao ID também é excluído de outras tabelas.
Mas, deliberadamente, deixo as postagens no fórum órfãs, rotuladas como "Publicado por = Usuário nº 123 =", para que as conversas anteriores sejam mantidas. Claramente, se um ID for reutilizado, isso será um problema.
Eu nunca tive esse problema antes porque sempre havia novos usuários suficientes para tornar improvável a reutilização de um ID dessa maneira. No entanto, no meu novo projeto, as inscrições são raras e as exclusões de usuários inativas são frequentes (especialmente porque as contas "Open Alpha" duram apenas três dias como uma visualização), e essa reutilização de ID aconteceu três a três agora.
Eu "corrigi" o problema salvando o valor correto para AUTO_INCREMENT em outro lugar e usando-o em vez de confiar no valor interno. Existe uma maneira real de o InnoDB lembrar o último valor real?
Respostas:
(evitando o problema nunca excluindo)
Como você deseja manter as
"Posted by =User #123="
informações depois de excluir o usuárioid=123
, também pode considerar o uso de 2 tabelas para armazenar dados dos usuários. Um paraActive
usuários e um para todos (incluindo os excluídos dos usuários ativos). E nunca exclua esses IDs daAllUser
tabela:Obviamente, isso complicará a operação de inserção de novo usuário. Qualquer novo usuário significa 2 inserções, uma em cada tabela. A exclusão de um usuário será excluída
ActiveUser
apenas da tabela. Todos os FKs serão excluídos em cascata, exceto as postagens do fórum, que farão referência àAlluser
tabela (onde nunca haverá exclusão).fonte
Não há maneira natural de fazer isso, exceto usar information_schema.tables para registrar todas as colunas com a opção auto_increment.
Você pode coletar essas colunas da seguinte maneira:
Crie um script que redefinirá os valores de incremento automático
Você pode fazer uma de duas coisas:
OPÇÃO # 1: executar o script manualmente após a inicialização
OPÇÃO # 2: Faça o mysqld executar o script antes de permitir conexões
Você precisaria adicionar esta opção
Dessa forma, toda vez que você reinicia o mysql, esse script é executado no início. Você precisará se lembrar de regenerar /var/lib/mysql/ResetAutoInc.sql antes de fazer uma reinicialização planejada do mysql.
fonte
Os documentos 5.5 sugerem armazenar o valor de incremento automático em outro lugar, como você já possui.
Uma solução alternativa seria emular uma SEQUENCE para que você não utilize o incremento automático na própria tabela real. Isso foi discutido no SO antes e novamente . O blog MySQL Performance menciona isso.
Ainda outros dados do MySQL que outros RDBMS não têm ...
fonte
Apenas não exclua o usuário. A integridade relacional é mais importante. Se você precisar, por motivos de privacidade ou qualquer outra coisa, simplesmente altere o nome de usuário para 'excluído' e limpe quaisquer outros campos.
fonte
Esta é uma pergunta antiga e ainda relevante.
1) Esse comportamento está sendo corrigido no Mysql 8.0.
2) Uma solução é usar uma linha fictícia para seus dados, para manter o AUTO_INCREMENT acima de um determinado valor. Não é super conveniente, dependendo do que você está armazenando, mas é uma solução simples em alguns casos.
fonte
Precisávamos disso e extrapolamos uma solução para nosso próprio sistema, com base nas instruções contidas neste post. Se isso puder ajudar alguém a atingir seu objetivo de uma maneira ainda mais fácil.
Nosso sistema usa um padrão de tabela de marca para exclusão para armazenar itens excluídos, porque fazemos sincronização bidirecional em sistemas desconectados; portanto, usamos esse código para corresponder as tabelas de marca para exclusão com suas tabelas ativas e extrair o valor mais alto possível :)
fonte