2011-04-29 45 views
4

檢查質疑第一:
Inserting an automatically generated index from a table into another table
我得到了這個功能「LAST_INSERT_ID()」做必要的
的問題是:我使用的是在我php腳本,如果某些用戶在「table1」中插入數據,並且在將「id」插入到「table2」之前,另一個用戶將數據插入到「table1」中,那麼該函數將爲第一個用戶檢索哪個「id」他的ID或第二個用戶的「最後一個」的ID?
我想檢索用戶自己「第一個用戶」插入的「id」,所以如果它沒有達到那個怎麼做?LAST_INSERT_ID()它是如何工作在多用戶環境

回答

25

LAST_INSERT_ID()爲您提供執行它的連接上的最後一個自動生成的標識,它不會返回MySQL服務器全局生成的最後一個插入標識。

+1

此外,它是(很)好習慣查詢後立即調用它。這樣你就不會錯。如果您在這方面遇到問題,您可能需要重新考慮您的代碼。 – tacone 2011-04-29 18:22:21

+0

注意:每個MySQL連接都屬於一個用戶,因此存在1對1的關係。在這種情況下,'lastInsertId'將始終返回用戶的最後一個自動生成的ID。但對於**共享MySQL連接**,您必須使用** transaction **才能獲得正確的'lastInsertId',因爲共享連接具有1對N的關係。 – Rakesh 2017-11-27 19:43:40

-1

永遠不要使用lastInsertId()和PostgreSQL序列,特別是當你的應用程序的插入/更新負載很高時。 PostgreSQL序列是非事務性的(一種自然的設計特徵,以避免獨佔鎖定,否則會產生不可接受的性能)。這意味着任何增加相同序列的併發事務都會使由lastInsertId()返回的值相對於事務的最後一個插入無效。例如:

Transaction 1 inserts with nextval('some_seq') yielding 100; 
Concurrent transaction 2 inserts with nextval('some_seq') yielding 101; 
Transaction 1 calls lastInsertId(), expecting 100, BUT GETS 101. 

這個PDO方法是PostgreSQL的braindead,總是使用INSERT ... RETURNING來代替。問候。

Source

+0

這是如何回答這個問題的?問題是關於MySQL函數['LAST_INSERT_ID()'](https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id),它顯然是標記的[tag:mysql]而不是'postgresql'。 – axiac 2017-09-25 16:37:37