У меня есть таблица со следующей схемой:
CREATE TABLE `tblsomething` (
`something_id` int(11) NOT NULL AUTO_INCREMENT,
…
PRIMARY KEY (`something_id`)
) ENGINE=InnoDB AUTO_INCREMENT=144620955
Мне нужно сбросить автоинкремент. Вот и подумываю сделать:
ALTER TABLE tblsomething MODIFY something_id int NOT NULL;
Но меня беспокоит эта часть документации MySQL:
В большинстве случаев ALTER TABLE работает, создавая временную копию исходной таблицы. В копии выполняется изменение, затем исходная таблица удаляется, а новая переименовывается. Пока выполняется ALTER TABLE, исходная таблица доступна для чтения другим сеансам. Обновления и записи в таблицу останавливаются до тех пор, пока новая таблица не будет готова, а затем автоматически перенаправляются в новую таблицу без каких-либо неудачных обновлений.
Так действительно ли отказ от автоматического увеличения является одним из таких случаев? Это заблокирует мой стол?
Определенный ALTER TABLE
утверждения всегда приведут к ужасной перестройке, как вы описываете.
В случае удаления AUTO_INCREMENT
только один способ предотвратить это - это некий неподдерживаемый взлом. Это включает изменение копии таблицы .frm
файл. Это работает, потому что информация схемы хранится отдельно от данных и информации индекса, и изменения не приводят к несогласованности между ними.
Вы можете найти обсуждение этого на mysqlperformanceblog.org и в Книга о высокой производительности MySQL. Однако важно подчеркнуть, что он не поддерживается. Я бы рекомендовал вам протестировать оба метода (простой ALTER TABLE
и .frm
редактирование) на копии данных в первую очередь. Посмотрите, сколько времени занимают оба процесса, и затем проверьте согласованность.
Изменить: извините, я перечитал написанное и ALTER COLUMN
не относится к тому, что вы делаете. Я обновил текст выше.
Удаление (или установка) флага AUTO_INCREMENT не восстанавливает всю таблицу. Вы можете легко проверить это, используя таблицу с большим количеством строк (установка этого флажка происходит почти мгновенно).
Обновить: Вероятно, это было верно давно (с MyISAM), но, похоже, это уже не так.