Заполняет ли MySQL (MyISAM) отверстия таблицы в многорядной вставке? - PullRequest
2 голосов
/ 17 ноября 2011

Я работаю над проектом, для которого мне нужно часто вставлять около 500 записей в удаленном месте. Я буду делать это за один INSERT, чтобы минимизировать сетевой трафик. Однако мне нужно знать точные значения id поля (AUTO_INCREMENT).

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

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

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

Многорядная вставка - это атомарная операция в MySQL (как MyISAM, так и InnoDB).Поскольку таблица будет заблокирована для записи во время этой операции, никакие другие строки не будут вставлены / обновлены во время ее выполнения.

Это означает, что идентификаторы фактически будут последовательными (если параметр auto-increment-increment не установлен в значение, отличное от 1

1 голос
/ 17 ноября 2011

Автоинкремент делает именно это, он автоинкрементно - то есть каждая новая строка рядом с численно следующим идентификатором.MySQL не повторно использует идентификаторы удаленных строк.

Ваше решение безопасно, поскольку операции записи требуют блокировки таблицы, поэтому никакие другие вставки не могут произойти, когда ваша операция завершится - так что вы получите n непрерывныхзначения автоинкремента для n вставленных строк.

...