表資料中自增id如何獲取

2022-04-08 19:52:34 字數 2261 閱讀 8961

1.自增表獲取自增id的方式大概有三種,scope_identity、ident_current 和 @@identity,使用方式以及效果見下。

2.效果展示

(1)準備基礎資料

if object_id(n'tb1', n'u') is not null

drop table tb1;

goif object_id(n'tb2', n'u') is not null

drop table tb2;

gocreate table tb1(id int identity);

create table tb2(id int identity(100,1));

gocreate trigger tb1insert on tb1 for insert

asbegin

insert tb2 default values

end;

goselect id from tb1;

--此時,id是empty

select id from tb2;

--此時,id是empty

(2)測試場景一

insert tb1 default values;

select @@identity;

/*返回100,實際上,這是觸發器返回的結果*/

select scope_identity();

/*返回1,在查詢前,由第乙個insert語句返回*/

select ident_current('tb2');

/*返回100,返回插入到tb2的值,在查詢前由觸發器插入*/

select ident_current('tb1');

/*返回1,返回插入到tb1的值,在查詢前由insert語句插入*/ 

(3)測試場景二

select @@identity;

/*返回null,因為查詢前沒有insert動作*/

select scope_identity();

/*返回null,因為在當前作用域當前會話中沒有insert動作*/

select ident_current('tb2');

/*返回100,返回tb2的最後乙個插入值*/

3.針對scope_identity解釋如下:

返回插入到同一作用域中的 identity 列內的最後乙個 identity 值。乙個作用域就是乙個模組——儲存過程、觸發器、函式或批處理。因此,如果兩個語句處於同乙個儲存過程、函式或批處理中,則它們位於相同的作用域中。

語法 scope_identity( ) 返回型別 sql_variant 注釋 scope_identity、ident_current 和 @@identity 在功能上相似,因為它們都返回插入到 identity 列中的值。

4.針對scope_identity、ident_current 和 @@identity 三者解釋如下:

ident_current 不受作用域和會話的限制,而受限於指定的表。ident_current 返回為任何會話和作用域中的特定表所生成的值。有關更多資訊,請參見 ident_current。

scope_identity 和 @@identity 返回在當前會話中的任何表內所生成的最後乙個標識值。

但是,scope_identity 只返回插入到當前作用域中的值;@@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,它像個「老母雞」。

如果想獲取當前會話和當前作用域的任何表的最新標識值,請使用scope_identity,它像個「專項城管」。

如果想獲取當前會話中任何作用域的任何表的最新標識值,請使用@@identity,它像個「萬能城管」。

資料表自增Id獲取時IDENTITY的正確使用方式

在sqlserver中很多表主鍵會設定為自增列,有的業務需求需要知道新插入的自增id是多少,一般我們會用select identity來獲取,可由於 identity是個全域性變數作用據較大,所以在高併發的時候會返回其他表插入的id導致邏輯錯誤。在sqlserver中有三個不同作用域的自增列返回方式...

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

identity 返回最後乙個插入 identity 的值,這些操作包括 insert,select into,或者 bulk copy。如果在給沒有 identity 列的其他表插入記錄,系統將其置為 null。如果有多行記錄插入到 identity 表中,identity 表示最後乙個產生的值。...

SQL Server 如何設定ID自增

對於已經建好的資料表,是不能在sql server management中進行視覺化的修改id為自增長,必須通過命令列來實現。自增列不能直接修改,必須將原有id列刪除,然後重新新增一列具有identity屬性的id欄位。比如你要修改的欄位名為id alter table 表名 drop column...