Пользовательское значение AUTO INCREMENT не работает

У меня есть следующий код sql для создания таблицы

CREATE TABLE db.object (
  `objid` bigint(20) NOT NULL AUTO_INCREMENT,
  `object_type` varchar(32) NOT NULL,
  PRIMARY KEY (`objid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

Однако значения в objid выходят как 1,2,3 ... (оператор вставки не добавляет идентификаторы)

AUTO_INCREMENT=2 не должен заставлять objid начинать с 2 вместо 1

Вы также можете сделать AUTO_INCREMENT(1,2), который запустит objid с 1 и увеличит значение 2.

whatthefish 27.04.2018 20:00

@whatthefish да, однако я хочу знать, неверен ли приведенный выше запрос и приводит ли к такому ошибочному поведению

user2133404 27.04.2018 20:02

Вы можете показать свой вставной оператор?

Aaron Dietz 27.04.2018 20:07

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

Strawberry 28.04.2018 06:36
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
4
69
3

Ответы 3

Я использовал ваш SQL, создал таблицу объектов и ввел два значения для object_type и objid, начиная с 2. Не вижу здесь ничего плохого ...

Может. Есть достаточно исключений и ошибок с auto-inc в таблицах InnoDB, которые заставляют полный обзор документации.

Тем не менее, есть один сценарий, который я могу придумать, когда MySQL игнорирует значение инициализатора. Процитирую документацию:

InnoDB uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described [here]:

InnoDB executes the equivalent of the following statement on the first insert into a table containing an AUTO_INCREMENT column after a restart:

SELECT MAX(ai_col) FROM table_name FOR UPDATE;

A server restart also cancels the effect of the AUTO_INCREMENT = N table option in CREATE TABLE and ALTER TABLE statements, which you can use with InnoDB tables to set the initial counter value or alter the current counter value.

Поэтому, если вы создадите эту таблицу, а затем перезапустите сервер (например, как часть процесса развертывания), вы получите хорошее значение 1 для начальной строки. Если вы хотите отменить это, вам нужно создать таблицу затем вставьте фиктивную строку со значением auto-inc, которое вы хотите, а затем перезапустить затем удалите фиктивную строку.

С таблицами InnoDB значение AUTO_INCREMENT будет сброс настроек до максимального значения (плюс 1), когда таблица открыта. Значение автоматического увеличения существует только в памяти, оно не сохраняется на диске.

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

Стол также можно закрыть в другое время. Например, при превышении open_table_cache (то есть, когда открыто большое количество других таблиц) MySQL закроет некоторые из открытых таблиц, чтобы освободить место в кэше для вновь открытых таблиц.

Я считаю, что это поведение задокументировано где-то в Справочном руководстве MySQL.

Это задокументировано, как упоминалось в моем ответе. :) +1, не знал, что превышение кеша таблицы также вызовет такое поведение. Слишком много исключений ...

bishop 27.04.2018 20:31

@bishop: я не видел твоего ответа, пока не опубликовал свой. Перезапуск сервера обязательно сбросит Auto_increment InnoDB. Как указывает ваш ответ (правильно), это не просто перезапуск сервера, который сбрасывает AUTO_INCREMENT. Я думаю, что "открытая таблица" выполняет сброс, а закрытие и открытие таблиц - это то, что InnoDB делает автоматически "за кулисами".

spencer7593 27.04.2018 21:19

Другие вопросы по теме