1. 程式人生 > >如何在mssql中獲取最新自增ID的值

如何在mssql中獲取最新自增ID的值

max 一次 執行 my sql server 數據庫 多條 的區別 mssq

@@IDENTITY 返回最後一個插入 IDENTITY 的值,這些操作包括:INSERT, SELECT INTO,或者 bulk copy。如果在給沒有 IDENTITY 列的其他表插入記錄,系統將其置為 null。如果有多行記錄插入到 IDENTITY 表中,@@IDENTITY 表示最後一個產生的值。如果觸發了某個觸發器,並且這個觸發器執行向另一個帶有 IDENTITY 列的表的插入操作,@@IDENTITY 將返回這個由觸發器產生的值。如果這個觸發器插入的表中不包含 IDENTITY 列,那麽 @@IDENTITY 將為 null。如果插入操作失敗,@@IDENTITY 值依然會增加,所以 IDENTITY 不保證數據的連續性。

從本身用法是沒有什麽區別的。
唯一區別的@@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 是可以的。

但在多線程情況下,就不行了。在多用戶交替插入數據的情況下max(id)顯然不能用。

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

如何在mssql中獲取最新自增ID的值