MySQL Auto_increment собирается 2 на 2

8

Я установил MySQL Workbench на днях, получил доступ к базе данных моей компании и сделал себе таблицу для работы. Все идет нормально. Проблема в том, что я заметил, что мой auto_increment увеличивается на 2 на 2. Например:

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

Когда я SHOW VARIABLES LIKE 'auto_inc%'получаю это:

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

Поэтому я попытался установить auto_increment_increment1 с:

SET @@auto_increment_increment=1

И после проверки снова SHOW VARIABLES LIKE 'auto_inc%'я подтвердил, что это «сработало» с результатом:

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

Но мои идентификаторы все еще увеличиваются в 2 на 2 .

В первый раз, когда я сделал это, это работало хорошо, а затем я закрыл MySQL Workbench, чтобы понять, что когда я снова открыл его, auto_increment_incrementбыло установлено значение 2 снова. Сейчас я пытаюсь сделать это снова, но, похоже, это больше не работает.

Может ли кто-нибудь помочь мне с этим, пожалуйста?

Спасибо, парни.

Бернардо Оливейра
источник
2
Я бы осторожно изменил это значение, не понимая, почему среда нашей компании устанавливает это. Это обычная переменная, которую нужно изменить, например, при запуске в репликации с несколькими мастерами. Кроме того, можем ли мы получить оператор SHOW CREATE TABLE для таблицы, с которой вы тестируете (кстати, тестирование на производстве - тоже плохая идея)
Дерек Дауни,
Это заслуживает того, чтобы быть ответом, я думаю. Или быть добавленным в существующий, что вы предпочитаете. Лучшее действие - это осторожное действие - или вообще никаких действий - для администраторов баз данных, которые хотят сохранить свою работу.
ypercubeᵀᴹ

Ответы:

7

Префикс, который был использован:

SET @@auto_increment_increment=1;

Такой же как:

SET @@SESSION.auto_increment_increment=1;

При изменении этого параметра он становится актуальным только в текущем сеансе.

Чтобы сделать более постоянное исправление, попробуйте:

SET GLOBAL auto_increment_increment=1;

Такой же как:

SET @@GLOBAL.auto_increment_increment=1;
Морган Токер
источник
Да, я думал, что @@ был атрибутом сессии. Из руководства по mysql: «Чтобы явно указать, что переменная является переменной сеанса, перед ее именем укажите SESSION, @@ session. Или @@» dev.mysql.com/doc/refman/5.1/en/set-option. html
Дерек Дауни,
Хм .. так оно и есть. Восстановление моего первого ответа.
Морган Токер
Привет, Морган, спасибо за ответ! Но что, если я не хочу или не могу сделать SET GLOBAL? Могу ли я установить его только для моей очень специфической БД / таблицы без использования переменных сеанса?
Бернардо Оливейра
Если вы не можете установить SET GLOBAL, каждый сеанс, в котором вы не хотите, чтобы это поведение выполнялось, запускайте SET auto_increment_increment = 1;
Морган Токер
2

Обе переменные имеют глобальные значения и значения сеанса. Таким образом, очень вероятно, что вы изменили только значение сеанса, которое пропало, когда вы закрывали MySQL Workbench.

Еще одна оговорка, на которую следует обратить внимание, это то, что

Эти переменные управляют поведением всех столбцов AUTO_INCREMENT во всех таблицах на сервере MySQL. Если задано глобальное значение любой переменной, его действие сохраняется до тех пор, пока глобальное значение не будет изменено или переопределено путем установки значения сеанса или до перезапуска mysqld. Если установлено локальное значение, новое значение влияет на столбцы AUTO_INCREMENT для всех таблиц, в которые текущий пользователь вставляет новые строки на время сеанса, если только значения не изменяются во время этого сеанса.

Вас также может обмануть способ вычисления следующего значения автоинкремента при изменении размера приращения. Он не использует последнее сохраненное значение столбца, но вычисляет следующее наибольшее значение по формуле

auto_increment_offset + N × auto_increment_increment

в то время как N является целым числом, так что новое значение больше, чем наибольшее из существующих.

Смотрите документацию auto_increment_increment, как это работает в деталях.

MicSim
источник
Это очень полезная информация. Спасибо MicSim! На самом деле я менял только значение сеанса. Попытка выяснить, как навсегда изменить его, но только для одного дБ или таблицы. Любые идеи?
Бернардо Оливейра
Как сказано в документации, установить ее в БД или в табличном виде невозможно. Извините, я не могу вам здесь помочь. Возможно, вы пытаетесь достичь чего-то с помощью функции автоинкремента, для которой она не предназначена.
MicSim