2012-01-17 53 views
2

希望这是一个简单的方法 - 我无法制定出健全的解决方案。MySQL - 在INSERT上返回生成的AUTO_INCREMENT值

我正在构建一个生成id_cart AUTO_INCREMENT主键的购物车机制。购物车商品有另一个带有购物车产品变量的表格,如大小。我想在大小表中归入相同的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()。

这将确保它是最后插入的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)); 

$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 2012-01-18 07:20:43

回答

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 2012-01-17 14:43:41

+0

另外,我认为性能大致相同,但您可能会发现使用内置的PHP函数'mysql_insert_id'更方便。这可能会使它更容易/更清洁地存储在PHP变量中,但我认为其性能大致相同。 – Travesty3 2012-01-17 14:47:25

+0

请注意,这种说法大部分是正确的,即只要您没有使用相同连接插入多个线程即可。 – 2012-01-17 14:51:39

2

如果你使用的是InnoDB的表类型,然后你就可以绝对确保您只需在交易包裹整个事情得到与正确的ID 。

MyISAM没有事务处理,但是当得到最后一个插入ID是基于连接时,这是行为。如果多个连接同时打开并且它们都插入到同一个表中,则每个连接都会返回它们插入的记录的ID。它不如innoDB提供的真正的事务支持强大,但是任何一个用户都不可能得到错误的ID。

0

我已经阅读过某处,我可以绝对确定这一点,并在那里我读到它的来源,如果你想死的确定不要依靠LAST_INSERT_ID。使用与插入记录相同的参数来选择新创建的记录并获取其ID。它与mysql的实现和线程等有关。

这就是说,我从来没有见过这样的实现,我也不使用这种方法。但是,记住这一点很有帮助。

+0

刚刚插入的行没有特定的行标识符 - 它是一个购物车,所以只有PHPSESSID和NOW()与产品变量一起使用。 CAn认为如果执行SELECT查询还有什么区别呢? – Tom 2012-01-17 14:51:54

+0

就像我之前提到的,如果你没有对多个连接使用相同的连接请求,并且如果你没有线程之间的连接对象,你应该是安全的。即使我的应用是在考虑到这些限制的情况下实施的只是有助于记住这些限制。 – 2012-01-17 15:22:32

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); 

感谢您的所有帮助 - 再次!