2009-10-16 70 views
0

我有兩個MySQL數據庫表,用於保存eshop訂單的數據。它們是這樣構建的(非常簡化的版本):在MySQL事務中保留自動增量ID

CREATE TABLE `orders` (
`id` int(11) NOT NULL auto_increment 
PRIMARY KEY (`id`) 
); 

CREATE TABLE `order_items` (
    `id` int(11) NOT NULL auto_increment, 
    `orderID` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

兩者之間的關係是orders.id對應於order_items.orderID。

我正在使用事務來下一個新訂單,但是有一個問題保留了上述關係。爲了獲得新的訂單ID。我必須提交命令INSERT查詢,獲取自動增量的id,然後爲訂單項目啓動另一個事務。這幾乎違背了使用交易的觀點。

我可以在訂單表中插入新的訂單,然後嘗試像

INSERT INTO order_items(orderID) VALUES(LAST_INSERT_ID()) 

我以爲會工作。但是,在插入第一個訂單商品LAST_INSERT_ID()後,將停止返回訂單標識,而是返回訂單商品標識,從而無法使用此查詢插入其他訂單商品。

有沒有辦法讓這個事情在單個事務中工作,或者我應該放棄並使用一個過程?

+0

這是錯誤的:「我必須提交訂單INSERT查詢,得到的自動增量ID,然後開始爲訂單項目其他事務」。我一直在這裏看到這個在stackoverflow。你從哪裏學到的? – longneck 2009-10-16 14:37:14

+0

@longneck我想你誤會了。那是我解釋我不想遵循的過程。 – 2009-10-17 10:58:29

回答

4

將這項工作?:

INSER QUERY; 
SET @insertid = LAST_INSERT_ID(); 
INSERT INTO `order_items` SET `OrderID` = @insertid; 

全部在一個聲明。您將不得不再次檢查語法

+0

或在應用程序中獲取LAST_INSERT_ID()的值,並在那裏爲order_items構建插入。 – longneck 2009-10-16 14:35:59

0

您無法依賴LAST_INSERT_ID(),因爲它在插入值到order_items時也發生更改,因爲它插入的ID也是auto_imcrement。 也許你可以試試這個。

INSERT INTO order_items(orderID) VALUES((SELECT id FROM orders ORDER BY id desc LIMIT 1)) 
+1

你提出的建議會造成競爭狀況。如果兩個人同時插入訂單,其中一人將得到錯誤的ID。 – longneck 2009-10-16 14:35:13