Я хотел бы добавить еще одну вещь, чтобы иметь в виду при использовании auto_inc особенность MySQL:
Представьте, что вы есть таблица employees
, которая использует auto_inc и (по любой причине) вторую таблицу с именем former_employees
. Давайте еще раз притворимся, что каждый сотрудник будет иметь уникальный идентификатор (следовательно, auto_inc), прикрепленный к нему, и что он даже не потеряет его из-за увольнения или увольнения.
По соображениям эффективности (давайте представим, что у компании несколько миллиардов сотрудников) ваша компания перемещает записи бывших сотрудников в одноименную таблицу.
Теперь вот снимок из двух таблиц (не против маленьких идентификаторов сейчас):
employees former_employees
------------------------ ------------------------
id | name | ... id | name | ...
------------------------ ------------------------
27 | Peter | ... 29 | Andrew | ...
28 | Jacko | ... 30 | Dennis | ...
32 | Paula | ... 31 | Lenny | ...
33 | JoDon | ...
Обратите внимание, что former_employees
последний ID равен 33
и employees
auto_inc счетчик равен 34
прямо сейчас.
Если бы выключит сервер на этом этапе и перезапустить его, employees
auto_inc бы отпрыгнуть до 33 !!! Это потому что MySQL не хранит счетчик auto_inc между перезапусками!
Помните об этом. С уважением.
PS: Чтобы обойти эту «функцию», вам придется запускать хранимые процедуры, которые смотрят на последний идентификатор former_employees
и устанавливают, если больше.
Примечание (S.Leske): Это относится к таблицам InnoDB, но не к таблицам MyISAM. Не знаю о других настольных двигателях.
Вы можете, однако, полагаться на last_insert_id, поскольку это относится к последнему вставленному идентификатору по этому соединению. – Erik
+1 спасибо ...... –
Эрик, это SQL Server или MySQL? Марк, транзакции не имеют к этому никакого отношения ... уровень изоляции определит, может ли транзакция считаться грязной или нет. –