@@IDENTITY 返回最後一個插入 IDENTITY 的值,這些操做包括:INSERT, SELECT INTO,或者 bulk copy。若是在給沒有 IDENTITY 列的其餘表插入記錄,系統將其置爲 null。若是有多行記錄插入到 IDENTITY 表中,@@IDENTITY 表示最後一個產生的值。若是觸發了某個觸發器,而且這個觸發器執行向另外一個帶有 IDENTITY 列的表的插入操做,@@IDENTITY 將返回這個由觸發器產生的值。若是這個觸發器插入的表中不包含 IDENTITY 列,那麼 @@IDENTITY 將爲 null。若是插入操做失敗,@@IDENTITY 值依然會增長,因此 IDENTITY 不保證數據的連續性。sql
從自己用法是沒有什麼區別的。
惟一區別的@@identity是sql server ,而last_insert_id()
是my sql,identity是跟last_insert_id的區別是若是出現insert多條記錄的時候,一個是取這個事務的最前面的哪一個,一個是取這個事務的最後一個.
last_insert_id()是取數據最後一下。而@@identity是順序取數據的數據庫
看到了吧!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表再插入一條記錄。
(3)、結果:在鏈接1中執行select 獲得的結果和鏈接2中執行select LAST_INSERT_ID()的結果是不一樣的;而在兩個鏈接中執行select max(id)的結果是相同的。LAST_INSERT_ID()
其實在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 是能夠的。ide
但在多線程狀況下,就不行了。在多用戶交替插入數據的狀況下max(id)顯然不能用。函數
這就該使用LAST_INSERT_ID了,由於LAST_INSERT_ID是基於Connection的,只要每一個線程都使用獨立的Connection對象,LAST_INSERT_ID函數將返回該Connection對AUTO_INCREMENT列最新的insert or update操做生成的第一個record的ID。這個值不能被其它客戶端(Connection)影響,保證了你可以找回本身的 ID 而不用擔憂其它客戶端的活動,並且不須要加鎖。線程