2013-02-12 56 views
5

我使用的是AUTO_INCREMENT,我希望得到插入行的ID,以便我可以使用ID作爲兩個表之間的公共字段更新另一個表。AUTO_INCREMENT和LAST_INSERT_ID

我瞭解,LAST_INSERT_ID將獲得最後ID。但是,我擔心的是,數據庫被許多用戶同時訪問。因此,可能有另一個進程訪問該表並且同時插入一個新行。

是否LAST_INSERT_ID回剛剛過去的ID,無論使用的連接,或者只返回最後一個ID爲我使用的連接?

通知,我訪問使用連接池Tomcat服務器的MySQL數據庫。

編輯:在夏日,我需要插入一個行表A中具有自動增量,比我需要在表B中,其需要被鏈接到表A中使用自動遞增值以插入一行。

+0

請提供更多詳細信息,這將有助於回答。 但仍然可以使用KeyHolder。 – psi 2013-02-12 07:50:50

回答

10
SELECT max(employeeid) FROM Employee; 

以上查詢返回Employee表中最後插入的記錄的employeeid值,因爲employeeid是自動增量列。這似乎是好的,但假設兩個線程正在同時執行插入操作,有可能會得到上次插入記錄的錯誤ID!別擔心,MySQL提供了一個函數,它返回最後插入記錄的自動增量列的值。

SELECT LAST_INSERT_ID(); 

LAST_INSERT_ID()總是特定連接,這意味着即使插入操作是從不同的連接同時進行,它總是返回當前連接特定操作的值。所以,你必須先插入Employee表中的記錄,運行上面的查詢來獲取id的值,並用這個在第二表中插入

+0

謝謝..我需要使用事務 - setAutocommit(false) - 爲了LAST_INSERT_ID工作。或者只要我使用相同的連接,它應該可以正常工作。 – user836026 2013-02-12 08:08:04

+0

@ user836026是安全的,你可以在INSERT之後立即調用這個SET,而不管是否在一個事務中,然後再次提到事務更接近MAX情況,如果在一個事務中被調用,那麼更有可能產生期望的結果交易,儘管如此,LAST_INSERT_ID是受歡迎的! – MediaVince 2017-02-01 16:38:54

1

LAST_INSERT_ID返回最後一個插入ID爲當前會話。 只要您沒有在當前連接中插入多個條目,它就是有效的。

進一步的信息在這裏:https://dba.stackexchange.com/questions/21181/is-mysqls-last-insert-id-function-guaranteed-to-be-correct

(我會鏈接到mysql.com,但目前羽絨對我來說)

+0

'LAST_INSERT_ID'是一個全局調用?有沒有特定表的'LAST_INSERT_ID'? – user961627 2013-02-24 14:37:05

+2

@ user961627我們應該知道,在當前會話中哪個表已經插入了最後一個表。 – scones 2013-02-24 15:16:14

2

LAST_INSERT_ID()工作方面,應當在交易或內部用戶定義的存儲程序或用戶定義的功能。

+0

謝謝...在Java中,如果我使用set auto commit爲false,並提交alter,它應該完成這項工作嗎? – user836026 2013-02-12 07:57:40

2

LAST_INSERT_ID是特定的連接。這是真的,但如果你使用連接池,你應該小心。當您在循環中執行連續的INSERT IGNORE語句時,這可能會產生問題,並且池在每次迭代中都會提供相同的連接。

例如;假設您將收到每個下同(開)連接:

INSERT IGNORE ... some-new-id >>>LAST_INSERT_ID回報100

INSERT IGNORE ... some-existing-id >>>LAST_INSERT_ID仍返回100(在前面操作的結果)

在調用LAST_INSERT_ID之前,檢查INSERT操作實際上是否插入了任何行是非常好的。