在sqlserver中很多表主鍵會設定為自增列,有的業務需求需要知道新插入的自增id是多少,一般我們會用select @@identity來獲取,可由於@@identity是個全域性變數作用據較大,所以在高併發的時候會返回其他表插入的id導致邏輯錯誤。
在sqlserver中有三個不同作用域的自增列返回方式:
ident_current:返回為任何會話和任何作用域中的特性表最後生成的標識值。
@@identity:返回為當前會話的所有作用域中的任何表最後生成的標識值。
scope_identity:返回為當前會話的當前作用域中的任何表最後生成的標識值。
例如,有兩個表 t1 和 t2,在 t1 上定義了乙個 insert 觸發器。當將某行插入 t1 時,觸發器被激發,並在 t2 中插入一行。此例說明了兩個作用域:乙個是在 t1 上的插入,另乙個是作為觸發器的結果在 t2 上的插入。
假設 t1 和 t2 都有 identity 列,@@identity 和 scope_identity 將在 t1 上的 insert 語句的最後返回不同的值。
@@identity 返回插入到當前會話中任何作用域內的最後乙個 identity 列值,該值是插入 t2 中的值。
scope_identity() 返回插入 t1 中的 identity 值,該值是發生在相同作用域中的最後乙個 insert。如果在作用域中發生插入語句到標識列之前喚醒呼叫 scope_identity() 函式,則該函式將返回 null 值。
而ident_current('t1') 和 ident_current('t2') 返回的值分別是這兩個表最後自增的值。
因此,對於@@identity要盡量避免使用,因為在大型開發中,你根本無法知道你獲得的是哪個自增列值,而盡量採用 scope_identity() 函式,scope_identity() 是在乙個操作範圍之內,最後一步操作所產生的自增列的值。
表資料中自增id如何獲取
1.自增表獲取自增id的方式大概有三種,scope identity ident current 和 identity,使用方式以及效果見下。2.效果展示 1 準備基礎資料 if object id n tb1 n u is not null drop table tb1 goif object i...
mysql重置所有表自增id
建立儲存過程之前需判斷該儲存過程是否已存在,若存在則刪除 drop procedure ifexists init sql string 建立儲存過程 create procedure init sql string begin 定義變數 declare s int default0 declare...
mysql插入資料,獲取最新插入的ID(自增列)
在mysql中,使用auto increment型別的id欄位作為表的主鍵。通常的做法,是通過 select max id from tablename 的做法,但是顯然這種做法需要考慮併發的情況,需要在事務中對主表以 x鎖 待獲得max id 的值以後,再解鎖。這種做法需要的步驟比較多,有些麻煩,...