MySQL Auto_increment passe 2 par 2

8

J'ai installé MySQL Workbench l'autre jour, j'ai accédé à la base de données de mon entreprise et créé une table avec laquelle travailler. Jusqu'ici tout va bien. Le problème est que j'ai remarqué que mon auto_increment incrémente de 2 par 2. Par exemple:

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

Quand SHOW VARIABLES LIKE 'auto_inc%'j'obtiens, j'obtiens ceci:

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

J'ai donc essayé de mettre auto_increment_incrementà 1 avec:

SET @@auto_increment_increment=1

Et après avoir vérifié à nouveau avec, SHOW VARIABLES LIKE 'auto_inc%'j'ai confirmé que cela "fonctionnait" avec le résultat:

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

Mais mes identifiants sont toujours incrémentés de 2 par 2 .

La première fois que je l'ai fait, cela a bien fonctionné, puis j'ai fermé MySQL Workbench pour réaliser que lorsque je l'ai rouvert, il auto_increment_incrementétait à nouveau réglé sur 2 . Maintenant, j'essaie de le faire à nouveau, mais cela ne semble même plus fonctionner.

Quelqu'un peut-il m'aider avec ça sil-vous-plait?

Merci les gars.

Bernardo Oliveira
la source
2
Je serais prudent de changer cette valeur sans bien comprendre pourquoi l'environnement de notre entreprise définit cela. C'est une variable courante à modifier lors de l'exécution dans une configuration de réplication multimaître, par exemple. Aussi, pouvons-nous obtenir une instruction SHOW CREATE TABLE pour la table avec laquelle vous testez (les tests sur la production sont également une mauvaise idée, btw)
Derek Downey
Cela mérite d'être une réponse, je pense. Ou pour être ajouté dans un existant, tout ce que vous préférez. La meilleure action est une action prudente - ou aucune action du tout - pour les administrateurs de base de données qui souhaitent conserver leur emploi.
ypercubeᵀᴹ

Réponses:

7

Le préfixe utilisé:

SET @@auto_increment_increment=1;

Est le même que:

SET @@SESSION.auto_increment_increment=1;

Lorsque vous modifiez ce paramètre, il ne devient pertinent que dans votre session actuelle.

Pour faire un correctif plus permanent, essayez:

SET GLOBAL auto_increment_increment=1;

Est le même que:

SET @@GLOBAL.auto_increment_increment=1;
Morgan Tocker
la source
Huh, je pensais que @@ était l'attribut de session. Du manuel mysql: "Pour indiquer explicitement qu'une variable est une variable de session, faites précéder son nom de SESSION, @@ session., Ou @@" dev.mysql.com/doc/refman/5.1/en/set-option. html
Derek Downey
Hmm .. il en est ainsi. Restauration de ma première réponse.
Morgan Tocker,
Hé Morgan, merci pour la réponse! Mais que faire si je ne veux pas ou ne peux pas faire un SET GLOBAL? Puis-je le définir uniquement pour ma base de données / table très spécifique sans avoir à utiliser les variables de session?
Bernardo Oliveira
Si vous ne pouvez pas SET GLOBAL, chaque session que vous ne voulez pas ce comportement exécutez SET auto_increment_increment = 1;
Morgan Tocker
2

Les deux variables ont des valeurs globales et de session. Il est donc très probable que vous n'ayez modifié que la valeur de la session qui avait disparu lorsque vous avez fermé le MySQL Workbench.

Une autre mise en garde à faire attention est que

ces variables contrôlent le comportement de toutes les colonnes AUTO_INCREMENT dans toutes les tables du serveur MySQL. Si la valeur globale de l'une ou l'autre variable est définie, ses effets persistent jusqu'à ce que la valeur globale soit modifiée ou remplacée en définissant la valeur de session, ou jusqu'à ce que mysqld soit redémarré. Si la valeur locale est définie, la nouvelle valeur affecte les colonnes AUTO_INCREMENT pour toutes les tables dans lesquelles de nouvelles lignes sont insérées par l'utilisateur actuel pour la durée de la session, sauf si les valeurs sont modifiées pendant cette session.

Ce qui pourrait également vous tromper, c'est la façon dont la prochaine valeur d'auto-incrémentation est calculée lorsque vous modifiez la taille de l'incrément. Il n'utilise pas la dernière valeur de colonne stockée, mais il calcule la valeur la plus élevée suivante à l'aide de la formule

auto_increment_offset + N × auto_increment_increment

tandis que N est un entier, de sorte que la nouvelle valeur est supérieure à la plus grande existante.

Voir la documentation auto_increment_increment pour savoir comment cela fonctionne en détail.

MicSim
la source
Ce sont des informations très utiles. Merci MicSim! En effet, je modifiais uniquement la valeur de la session. Essayer de comprendre comment le changer définitivement mais uniquement pour une base de données ou une table. Des idées?
Bernardo Oliveira
Comme le dit la documentation, il n'est pas possible de le définir db ou table. Je suis désolé, je ne peux pas vous aider ici. Peut-être que vous essayez de réaliser quelque chose avec la fonctionnalité d'auto-incrémentation à laquelle il n'était pas destiné.
MicSim