[英]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.