Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > получить id на упреждение


Автор: bars80080 9.8.2010, 15:24
возникла такая задачка: при вставке записи в БД (mysql) надо одно поле заполнить неким параметром, вычисление которого основывается на id этой записи.

не сложно после запроса insert... запросить идентификатор: select last_insert_id(), а затем апдейтом обновить это самое поле

но ведь текущее значение автоинкремента можно получить из show table status

будет ли получение значения id заранее чревато ошибкой, когда между show table status и insert проскочит запрос другого пользователя?
или просто не заморачиваться и делать традиционно insert, select last_insert_id(), update ?

Автор: ksnk 9.8.2010, 16:00
bars80080, А к чему такие оптимизации? типа, хочется все сделать "одним запросом"?
Нельзя, так как между любыми двумя запросами из php в mysql МОГУТ проскочить сколь угодно много других запросов от других процессов.
Варианты:
-- залочить таблицу на добавление записей, и сделать грязное дело ервым способом...
-- использовать хранимую процедуру, которая сама сделает обновление таблицы после вставки данных. Хотя выигрыш от хранимых процедур может и не впечатлить ;) тут придется работать по второму способу. Хотя вместе с локом может проити и первый.


Автор: bars80080 9.8.2010, 16:31
Цитата(ksnk @  9.8.2010,  16:00 Найти цитируемый пост)
А к чему такие оптимизации?

тупо напрягает

ну раз нет, так нет


Цитата(ksnk @  9.8.2010,  16:00 Найти цитируемый пост)
-- залочить таблицу на добавление записей, и сделать грязное дело ервым способом...

что-то я не понял, а зачем тут лочить таблицу? разве я не получу в любом случае корректный id последнего запроса insert в текущем скрипте от select last_insert_id()?

я думал, что там автоматом определяется относительно открытого соединения

Автор: ksnk 9.8.2010, 18:55
bars80080, я путаю первый и второй  smile 

Первый способ по моему -  это 
-- залочить таблицу на запись, 
-- узнать номер следующей вставляемой записи с помощью show table status 
-- и смонтировать нужный запрос и выполнить его.

а второй - это обычный, через last_insert_id

Автор: SelenIT 9.8.2010, 23:39
а триггером это не сделается?

Автор: bars80080 10.8.2010, 10:48
триггер мы не потянем, да и не нужно наверное в такой мизерной задаче

лочить - это лишние запросы, хотя и попроще метод, но не будем искать лишних приключений

спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)