Что мне нужно сделать, если нужно, чтобы $mdb2->lastInsertID() возвращал значение автоинкремента для этого соединения?

Недавно я перешел с SQL Server на MySQL, и нигде не могу найти достаточно убедительного ответа на этот вопрос:

Я использую PHP, MySQL и механизм таблиц InnoDB для таблиц, которые нужно заблокировать. Итак, для стандартной серии из 3 утверждений:

  1. Вставить в таблицу А
  2. $id = $mdb2->lastInsertID()
  3. Вставьте в таблицу B (name, fk) VALUES ('foo', $id)

Какие шаги мне нужно предпринять, чтобы убедиться, что $ id имеет значение вставки из шага 1? Это так, как есть? Все ли должно быть в транзакции? Нужно ли добавлять другие запросы для блокировки и освобождения таблиц?

Спасибо, парни.

2 ответа

Вы должны / могли, но вам НЕ НУЖНО ничего делать: информационные функции, function_last-insert-id

Сгенерированный идентификатор сохраняется на сервере для каждого соединения. Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющего на столбец AUTO_INCREMENT этим клиентом. На это значение не могут повлиять другие клиенты, даже если они генерируют собственные значения AUTO_INCREMENT. Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь об активности других клиентов и не нуждаясь в блокировках или транзакциях.

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

ИЛИ справиться самостоятельно

Если шаг 3 завершится неудачно, вы получите сообщение об ошибке из mysql, сохраните это сообщение в переменной и проверьте, что в случае получения удалите запись, вставленную в 1 шаг.

Это все, что обрабатывать транзакции. Вы должны использовать транзакцию.

Другие вопросы по тегам