Auto_increment do MySQL indo 2 por 2

8

Instalei o MySQL Workbench outro dia, acessei o banco de dados da minha empresa e criei uma tabela para trabalhar. Por enquanto, tudo bem. O problema é que notei que meu incremento automático está aumentando 2 por 2. Por exemplo:

ID    NAME
1     Paul
3     Jack
5     Louis
7     John
...

Quando eu SHOW VARIABLES LIKE 'auto_inc%'recebo isso:

'auto_increment_increment', '2'
'auto_increment_offset', '1'

Então, tentei definir auto_increment_increment1 com:

SET @@auto_increment_increment=1

E depois de verificar novamente com SHOW VARIABLES LIKE 'auto_inc%'eu confirmei que "funcionou" com o resultado:

'auto_increment_increment', '1'
'auto_increment_offset', '1'

Mas meus IDs ainda estão sendo incrementados em 2 por 2 .

A primeira vez que o fiz, funcionou bem e fechei o MySQL Workbench para perceber que, quando o abri novamente, auto_increment_incrementestava definido como 2 novamente. Agora estou tentando fazer isso de novo, mas nem parece mais funcionar.

Alguém pode me ajudar com isso por favor?

Obrigado rapazes.

Bernardo Oliveira
fonte
2
Seria cuidadoso ao alterar esse valor sem entender completamente por que o ambiente de nossa empresa define isso. É uma variável comum a ser alterada ao executar em uma configuração de replicação multimestre, por exemplo. Além disso, podemos obter um SHOW CREATE TABLE para a tabela que você está testando com (testes em produção também é uma má idéia, btw)
Derek Downey
Isso merece ser uma resposta, eu acho. Ou para ser adicionado a um já existente, o que você preferir. A melhor ação é cautelosa - ou nenhuma ação - para os DBAs que desejam manter seu emprego.
ypercubeᵀᴹ

Respostas:

7

O prefixo usado:

SET @@auto_increment_increment=1;

É o mesmo que:

SET @@SESSION.auto_increment_increment=1;

Ao modificar essa configuração, ela se torna relevante apenas na sua sessão atual.

Para fazer uma correção mais permanente, tente:

SET GLOBAL auto_increment_increment=1;

É o mesmo que:

SET @@GLOBAL.auto_increment_increment=1;
Morgan Tocker
fonte
Ah, eu pensei que @@ era o atributo da sessão. No manual do mysql: "Para indicar explicitamente que uma variável é uma variável de sessão, anteceda seu nome por SESSION, @@ session. Ou @@" dev.mysql.com/doc/refman/5.1/en/set-option. html
Derek Downey
Hmm .. assim é. Restaurando minha primeira resposta.
Morgan Tocker 12/09
Ei Morgan, obrigado pela resposta! Mas e se eu não quiser ou não puder fazer um SET GLOBAL? Posso defini-lo apenas para minha tabela / banco de dados muito específica sem precisar usar as variáveis ​​de sessão?
Bernardo Oliveira
Se você não pode SET GLOBAL, a cada sessão que você não deseja esse comportamento, execute SET auto_increment_increment = 1;
Morgan Tocker 14/09/11
2

Ambas as variáveis ​​têm valores globais e de sessão. Portanto, é muito provável que você apenas alterou o valor da sessão que desapareceu quando você fechou o MySQL Workbench.

Outra ressalva a prestar atenção é que

essas variáveis ​​controlam o comportamento de todas as colunas AUTO_INCREMENT em todas as tabelas no servidor MySQL. Se o valor global de qualquer variável for definido, seus efeitos persistirão até que o valor global seja alterado ou substituído pela configuração do valor da sessão ou até que o mysqld seja reiniciado. Se o valor local for definido, o novo valor afetará as colunas AUTO_INCREMENT de todas as tabelas nas quais novas linhas são inseridas pelo usuário atual durante a sessão, a menos que os valores sejam alterados durante a sessão.

O que também pode enganá-lo é a maneira como o próximo valor de incremento automático é calculado quando você altera o tamanho do incremento. Ele não usa o último valor da coluna armazenada, mas está calculando o próximo valor mais alto usando a fórmula

auto_increment_offset + N × auto_increment_increment

enquanto N é um número inteiro, de modo que o novo valor seja maior que o maior existente.

Consulte a documentação auto_increment_increment como funciona em detalhes.

MicSim
fonte
Essa é uma informação muito útil. Obrigado MicSim! Na verdade, eu estava mudando apenas o valor da sessão. Tentando descobrir como alterá-lo permanentemente, mas apenas para um banco de dados ou tabela. Alguma ideia?
Bernardo Oliveira
Como a documentação diz, não é possível configurá-lo como db ou tabela. Sinto muito, não posso ajudá-lo aqui. Talvez você esteja tentando conseguir algo com o recurso de incremento automático para o qual não foi planejado.
MicSim