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

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

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

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

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

Спасибо, ребята.

Ответы [ 2 ]

4 голосов
/ 14 января 2012

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

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

0 голосов
/ 11 апреля 2011

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

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

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

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

...