2012-01-17 49 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); 

感謝您的所有幫助 - 再次!