2012-01-17 3 views
2

Надеюсь, что это простой способ - я не могу найти надежное решение.MySQL - возвращаемое генерируемое значение AUTO_INCREMENT на INSERT

Я создаю механизм тележки, который генерирует первичный ключ AUTO_INCREMENT id_cart. В элементе тележки есть другая таблица с переменными, такими как размер. Я хочу указать один и тот же id_cart в таблице размеров.

CREATE TABLE 
-> id_size_cart NOT NULL PRIMARY KEY AUTO_INCREMENT, 
-> id_cart //THIS WILL BE THE AI value from the product cart 
-> size_name 

Я видел SELECT LAST_INSERT_ID().

Насколько твердым это будет гарантировать, что это последний вставленный идентификатор? Не хотите, чтобы клиенты получали неправильный размер!

__ EDIT ___

Спасибо за вход. Тем не менее, у меня проблемы. См. Фактический код ниже;

//add product to cart table 
$addtocart_sql = "INSERT INTO store_cart (id_cart, id_session) VALUES ('', '".$_COOKIE["PHPSESSID"]."')"; 
$addtocart_res = mysqli_query($dbConnect, $addtocart_sql) or die(mysqli_error($dbConnect)); 

$last_row_id = mysqli_query($dbConnect, "SELECT LAST_INSERT_ID()") or die(mysqli_error($dbConnect)); 

echo 'INSERT worked!<br/>'; 
echo $last_row_id; 

Ошибка показывает, как

Parse error: syntax error, unexpected T_STRING in /websites/LinuxPackage05/4v/35/xy/4v35xy-55415.webfusion-hosting.co.uk/public_html/noff-group.com/dev/add_to_cart.php on line 27

Спасибо заранее.

+0

Какая из них - линия 27? Кроме того, это синтаксическая ошибка PHP. Я не думаю, что он напрямую связан с частью SELECT LAST_INSERT_ID(). (Кстати: есть функция '' mysqli_insert_id() '(http://www.php.net/manual/en/mysqli.insert-id.php)) – jensgram

ответ

8

the manual От:

For LAST_INSERT_ID() , the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client. It is not even changed if you update another AUTO_INCREMENT column with a nonmagic value (that is, a value that is not NULL and not 0). Using LAST_INSERT_ID() and AUTO_INCREMENT columns simultaneously from multiple clients is perfectly valid. Each client will receive the last inserted ID for the last statement that client executed.

+0

Ну ладно - думаю, что отвечает на мой вопрос. Спасибо @jensgram. – Tom

+0

Кроме того, я думаю, что производительность примерно такая же, но вы можете найти более удобным использование встроенной функции PHP 'mysql_insert_id'. Это может упростить/очистить его в переменной PHP, но я думаю, что производительность примерно такая же. – Travesty3

+0

Обратите внимание, что это утверждение в основном верно, т. Е. До тех пор, пока вы не используете многопотоковую вставку с использованием того же соединения. –

2

Если вы используете InnoDB в качестве типа таблицы, то вы будете в состоянии сделать абсолютно уверены, что вы получите правильный идентификатор с просто оборачивать все дело в сделке ,

MyISAM не имеет транзакций, но это поведение, когда получение последнего идентификатора вставки основано на соединении. Если одновременно открываются несколько соединений, и все они вставляются в одну и ту же таблицу, каждое соединение вернет идентификатор для записи, которую они вставили. Он менее надежный, чем настоящая поддержка транзакций innoDB, но маловероятно, что любой пользователь получит неверный идентификатор.

0

Я прочитал где-то, я могу быть абсолютно уверены в том, что и источник, где я читал, что если вы хотите быть абсолютно уверены НЕ полагаться на LAST_INSERT_ID. Используйте те же параметры, которые вы использовали для вставки записи, чтобы выбрать вновь созданную запись и получить ее идентификатор. Это как-то связано с реализацией и потоками mysql и т. Д.

Это говорит о том, что я никогда не видел такой реализации, я тоже не использую этот метод. Однако это помогает помнить об этом.

+0

Нет определенного идентификатора строки для только что вставленной строки - это тележка, поэтому с переменными продукта используются только PHPSESSID и NOW(). CAn думаете, как еще определить строку при выполнении запроса SELECT? – Tom

+0

Как я уже упоминал, если вы не используете один и тот же запрос на соединение для нескольких подключений, и если у вас нет объекта соединения между потоками, вы должны быть в безопасности. Даже мое приложение реализовано с учетом этих ограничений. Просто помогает сохранить эти ограничения. –

0

Мой синтаксис был немногочисленным - см. Код ниже, возвращающий правильный LAST ID.

//add product to cart table 
$addtocart_sql = "INSERT INTO store_cart (id_cart, id_session) VALUES ('', '".$_COOKIE["PHPSESSID"]."')"; 
$addtocart_res = mysqli_query($dbConnect, $addtocart_sql) or die(mysqli_error($dbConnect)); 

// REQUIRED 'i' + '$dbConnect' for MYSQLI function 
echo 'INSERT worked!<br/>'; 
echo mysqli_insert_id($dbConnect); 

Спасибо за помощь - снова!

Смежные вопросы