mysql last_insert_id() (轉載)

劍握在手發表於2017-08-18

先來看看官方的說明

  1. The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.  

看到了吧!last_insert_id()函式的返回值不是基於整個資料庫的插入語句,
而是基於單個連線客戶端之間所執行的insert語句最近一條,而且客戶端之間是不會影響的,它是連線級別的函式,只對當前使用者的連線有效。

=============================================================

以下文章來源於網路

在MySQL中,使用auto_increment型別的id欄位作為表的主鍵。
通常的做法,是通過“select max(id) from tablename”的做法,但是顯然這種做法需要考慮併發的情況,需要在事務中對主表加以“X鎖“,待獲得max(id)的值以後,再解鎖。
這種做法需要的步驟比較多,有些麻煩,而且併發性也不好。有沒有更簡單的做法呢?答案之一是通過select LAST_INSERT_ID()這個操作。
乍一看,它和select max(id)很象,但實際上它是執行緒安全的。也就是說它是具體於資料庫連線的。下面通過實驗說明:
(1)、在連線1中向A表插入一條記錄,A表包含一個auto_increment型別的欄位。
(2)、在連線2中向A表再插入一條記錄。
其實在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的區別和這裡是類似的。使用SCOPE_IDENTITY()可以獲得插入某個IDENTITY欄位的當前會話的值,而使用IDENT_CURRENT()會獲得在某個IDENTITY欄位上插入的最大值,而不區分不同 的會話。
注:使用select last_insert_id()時要注意,當一次插入多條記錄時,只是獲得第一次插入的id值,務必注意!
 

LAST_INSERT_ID 是與table無關的,如果向表a插入資料後,再向表b插入資料,LAST_INSERT_ID會改變。

一般情況下獲取剛插入的資料的id,使用select max(id) from table 是可以的。

但在多執行緒情況下,就不行了。在多使用者交替插入資料的情況下max(id)顯然不能用。

這就該使用LAST_INSERT_ID了,因為LAST_INSERT_ID是基於Connection的,只要每個執行緒都使用獨立的Connection物件,LAST_INSERT_ID函式將返回該Connection對AUTO_INCREMENT列最新的insert or update操作生成的第一個record的ID。這個值不能被其它客戶端(Connection)影響,保證了你能夠找回自己的 ID 而不用擔心其它客戶端的活動,而且不需要加鎖。

 

出處:http://sucre.blog.51cto.com/1084905/723808,如果你也想轉載可別忘了加出處,不然這哥們要追究你法律責任的……

相關文章