2010-01-23 50 views
3

我正在使用adodb for PHP庫。我如何處理mysql表中的併發插入並獲取正確的插入ID

有關讀取在該記錄插入我使用這個功能

"$db->Insert_ID()"

我想知道,如果有多個,並同時插入到數據庫表中的ID,將這個方法返回我的正確插入的ID爲每記錄插入?

我問這個問題的原因是因爲我使用這個最後一個插入ID來進一步處理其他記錄,並在相關表中做出後續條目。

這種方法足夠安全嗎?或者我錯過了一些東西。

請幫我制定一個適當的工作計劃,以便我可以使用最後一個插入ID進一步插入另一個表中,而不必搞亂現有數據。

感謝

回答

10

是的,它可以安全使用。這是因爲LAST_INSERT_ID()是每個連接的,如所解釋here

已生成是 保持在服務器上的 每個連接的ID。這意味着 函數返回的值爲 給定的客戶端是第一個 AUTO_INCREMENT值爲 生成的最新語句影響該客戶端的 AUTO_INCREMENT列。 該值不會受其他 客戶端的影響,即使它們生成自己的AUTO_INCREMENT值爲 。 此行爲確保每個客戶端 都可以檢索其自己的ID,而不需要考慮其他 客戶端的活動 ,並且不需要鎖定或事務 。

+0

謝謝Y. Shoham – 2010-01-25 07:26:37

+0

不客氣。 – 2010-01-25 07:29:52

+0

當你說客戶端時,我認爲你的意思是不同的ips請求,如果客戶端只有本地主機,並且你有多個腳本同時運行,並且你需要準確的最後一個插入ID,那麼該怎麼辦? – Ajibola 2013-12-12 10:21:50

1

的$ DB-> INSERT_ID()將返回你只所以如果要插入多條記錄,並希望得到每個最後插入的行的ID最後插入ID,那麼這將成功運行。

+0

謝謝sarfraz :) – 2010-01-25 07:27:51

1

我想知道是否有多個同時插入到數據庫表中,此方法是否會爲插入的每條記錄返回正確的插入ID?

它將只返回最近插入的ID。
爲了獲得多個插入的ID,您必須在每個語句執行後調用INSERT_ID()。 IE:

INSERT INTO TABLE .... 
INSERT_ID() 

INSERT INTO TABLE .... 
INSERT_ID() 

...獲取每個插入的id值。如果你跑了:

INSERT INTO TABLE .... 
INSERT INTO TABLE .... 
INSERT_ID() 

...只會返回最後一個插入語句的ID。

這種方法足夠安全嗎?或者我錯過了一些東西。

它比使用SELECT MAX(id) FROM TABLE更安全,這可能會返回其他人插入的與隔離級別有關的值。

+0

感謝您的回答:) – 2010-01-25 07:27:27