пятница, 13 ноября 2009 г.

AUTO_INCREMENT в InnoDB

Весьма неожиданное поведение автоинкремента было обнаружено в InnoDB (MySQL >= 5.0).

С MyISAM всё достаточно просто - берётся значение из параметров таблицы, используется для вставки и увеличивается на единицу для следующей вставки. При вставке заданного значения в таблицу, значение AUTO_INCREMENT соответствующим образом подпрыгнет подстраиваясь под вставляемое. Если вставлялось значение меньше чем AUTO_INCREMENT, то значение счётчика не подпрыгнет. Значение AUTO_INCREMENT можно изменить при помощи ALTER TABLE `table` AUTO_INCREMENT value; При этом MyISAM не анализирует это значение, а просто задаёт. Если при вставке в уникальный столбец автоматическое значение уже есть, то происходит ошибка DUPLICATE KEY;

C InnoDB всё гораздо интереснее. Автоинкрементируемое поле должно обладать ключом. При старте сервера значение AUTO_INCREMENT сбрасывается до максимального существующего значения +1. Нумерация может быть непоследовательной из-за транзакций. Задать значение меньше максимально существующего невозможно, альтре отработает, не выдав ошибки, но фактическое значение он не изменит. Задать значение много больше максимального возможно, но при рестарте сервера оно сбросится до максимального.

PS В InnoDB начиная с MySQL 5.1 появилось понятие "блокировка автоинкремента". Подробнее об этом можно почитать AUTO_INCREMENT Handling in InnoDB

Комментариев нет: