Получение значения первичного ключа после INSERT.

maxru

МИФИст
Получение значения первичного ключа после INSERT.

Есть класс Good, инкапсулирующий в себе данные о товаре.
Например:
good_id, good_name и good_price (для простоты оставим 3 поля).

Есть метод, обеспечивающий сохранение информации о товаре в БД.
Если good_id целое число, то происходит UPDATE, если good_id == false, то происходит попытка
вставки новой записи в БД.
После вставки нужно обновить поле good_id значением автоматически присвоенном БД этому полю при вставке записи.
(good_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY)
Додумался только до этого:
PHP:
private function _insert()
	{
	    $Database = Database::getInstance();
	    $query = "INSERT INTO `goods` (`good_name`, `good_price`) VALUES ('".$this->getGoodName()."', ".$this->getGoodPrice().")";
	    $result = $Database->doQuery($query);
	    if($result->size() != 0)
	    {
	        return false;
	    }
	    $query = "SELECT MAX(`good_id`) as `last_good_id` FROM `goods`";
	    $result = $Database->doQuery($query);
	    if($result->size() != 0)
	    {
	        $row = $result->fetch();
	        $this->setGoodId($row['last_good_id']);
	    }
	    return true;
	}
Но мне почему-то кажется, что есть определенная вероятность, что между запросом 1 (INSERT) и запросом 2 (SELECT) может произойти еще один или несколько INSERT'ов и я получу в результате "чужой" good_id.

Так как получить good_id, добавленный именно в результате МОЕГО запроса INSERT, а не оного, произведенного из другой копии скрипта?
 

maxru

МИФИст
Автор оригинала: voituk
SELECT LAST_INSERT_ID()
Смотри:
Each client will receive the last inserted ID for the last statement that client executed.
Получается, что если я сначала выполняю запрос:
SELECT LAST_INSERT_ID() FROM `goods`
А затем сохраняю этот good_id и делаю INSERT с конкретным good_id, то может получиться так, что за время, прошедшее между двумя запросами этот самый good_id в таблице мог и уведичиться.
Так что вопрос не в том, какой функцией получить последний id (про LAST_INSERT_ID() забыл, маразматик :D ), а в том, чтобы за время между получением и вставкой записи никто больше других записей не вставил.

-~{}~ 17.08.07 17:23:

MuXaJIbI41981, спасибо, то что надо.
Надо усиливать свои поисковые способности, а то не нашел почему-то эту функцию :D

-~{}~ 17.08.07 17:24:

Секундочку, а не работает ли mysql_insert_id() как тот же "SELECT LAST_INSERT_ID()"???

-~{}~ 17.08.07 17:27:

Все, ОК. voituk, MuXaJIbI41981, вы оба правы. И "SELECT LAST_INSERT_ID()" и mysql_insert_id([link_identifier]) вернут значение good_id для конкретного link_identifier.
 

html_coder

Новичок
Автор оригинала: maxru

Так что вопрос не в том, какой функцией получить последний id (про LAST_INSERT_ID() забыл, маразматик :D ), а в том, чтобы за время между получением и вставкой записи никто больше других записей не вставил.
А разве не так LOCK TABLES
 

maxru

МИФИст
html_coder я уже написал, что все нормально, и что возвращается последнее значение для конкретного link_identifier. То есть выполнил INSERT - получи LAST_INSERT_ID() для этого соединения.

Так что пойду лучше RTFM. Чего и остальным рекомендую.
 
Сверху