У меня есть следующий код 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
@whatthefish да, однако я хочу знать, неверен ли приведенный выше запрос и приводит ли к такому ошибочному поведению
Вы можете показать свой вставной оператор?
Если вас волнует значение увеличивающегося идентификатора, это может указывать на более фундаментальный недостаток в дизайне вашей схемы.






Может. Есть достаточно исключений и ошибок с 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: я не видел твоего ответа, пока не опубликовал свой. Перезапуск сервера обязательно сбросит Auto_increment InnoDB. Как указывает ваш ответ (правильно), это не просто перезапуск сервера, который сбрасывает AUTO_INCREMENT. Я думаю, что "открытая таблица" выполняет сброс, а закрытие и открытие таблиц - это то, что InnoDB делает автоматически "за кулисами".
Вы также можете сделать
AUTO_INCREMENT(1,2), который запуститobjidс 1 и увеличит значение 2.