簡體   English   中英

MySQL LAST_INSERT_ID查詢

[英]MySQL LAST_INSERT_ID Query

我看過官方文檔,但仍然有些困惑。

說我有一個過程,它運行並執行插入,然后我請求LAST_INSERT_ID() ,我是從正在運行的過程實例剛剛完成的插入中獲取最后一個插入ID,還是通過任何被稱為過程的實例/會話?

例如,說最后插入的記錄ID是4,我調用了該過程,插入將是ID 5,但是插入失敗,我會得到4作為最后插入ID或null / 0值返回嗎?

您在問題中提供的指向文檔頁面的鏈接確實有一個答案:

生成的ID在每個連接的服務器中維護。 這意味着函數返回給定客戶端的值是針對該客戶端影響AUTO_INCREMENT列的最新語句生成的第一個AUTO_INCREMENT值。 即使其他客戶端生成自己的AUTO_INCREMENT值,該值也不會受到其他客戶端的影響。 此行為可確保每個客戶端都可以檢索自己的ID,而不必擔心其他客戶端的活動,也不需要鎖或事務。

因此,沒有其他客戶的競爭條件。 您需要在與INSERT相同的連接中請求LAST_INSERT_ID()才能獲得正確的結果。

至於事務回滾時會發生什么,它是未定義的:

如果前一條語句返回錯誤,則LAST_INSERT_ID()的值未定義。 對於事務表,如果由於錯誤而回滾該語句,則LAST_INSERT_ID()的值將保持未定義狀態。 對於手動ROLLBACK,LAST_INSERT_ID()的值不會恢復為事務之前的值; 它保持在ROLLBACK時的狀態。

您鏈接到的文檔說:

生成的ID在每個連接的服務器中維護。 這意味着函數返回給定客戶端的值是針對該客戶端影響AUTO_INCREMENT列的最新語句生成的第一個AUTO_INCREMENT值。 即使其他客戶端生成自己的AUTO_INCREMENT值,該值也不會受到其他客戶端的影響。

這意味着您可以安全地依賴LAST_INSERT_ID()返回的值。 它是由調用LAST_INSERT_ID()的同一代碼實例生成的最新自動遞增值。 當然,您必須在要獲取其值的INSERT語句之后立即調用它,它不能返回第二個或更早的INSERT語句生成的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM