Identity是標識值,在SQL Server中,有ID列,ID屬性,ID值,ID列的值等術語。 Identity屬性是指在創建Table時,為列指定的Identity屬性,其語法是:column_name type IDENTITY [ (seed , increment) ],Identity ...
Identity是標識值,在SQL Server中,有ID列,ID屬性,ID值,ID列的值等術語。
Identity屬性是指在創建Table時,為列指定的Identity屬性,其語法是:column_name type IDENTITY [ (seed , increment) ],Identity屬性有兩個參數:seed和increment,seed是ID值的初始值,increment是ID值的增量。在Table中創建的Column,如果使用Identity屬性標識,那麼該列是ID列。預設情況下,不能顯式向ID列插入數值。ID列是由系統自動賦值的,在賦值時,系統根據該表的ID值,自動插入遞增的,唯一的數值,同時ID值根據Increment自動遞增。ID值有自動遞增的特性,當語句執行失敗或事務回滾時,ID值不會回滾,這會導致ID列的值不連續。
如果想要顯式向ID列插入特定的數值,那麼,必須啟用 Identity_Insert選項,該選項自動將ID值更新為ID列的最大值。
set identity_insert schema_name.table_name on
在transactional replication中,如果訂閱端的ID列設置屬性:not for replication,那麼,當replication agent執行插入操作,該列的ID值不會增加,因此,ID列的最大值和ID值,不總是保持相同。
If this property is specified for the IDENTITY property, values are not incremented in identity columns when replication agents perform inserts.
一,Identity函數
1,只能用於select-into子句中,新建一個含有Identity 列的數據表
IDENTITY (data_type [ , seed , increment ] ) AS column_name
2,查看ID列的Seed,Increment和當前ID值
IDENT_INCR ( 'table_or_view' ) IDENT_SEED ( 'table_or_view' ) IDENT_CURRENT( 'table_or_view' )
函數Ident_Current()用於返回指定Table的當前ID值。
二,Identity 屬性
在創建(Create)或修改(Alter)Table時,為列定義Identity屬性,那麼該列就是ID列。被屬性 Identity 標識的ID列,能夠被函數$IDENTITY引用;
IDENTITY [ (seed , increment) ]
三,使用DBCC CheckIdent 查看或修改ID值
DBCC 是Database Console Commands 的簡寫,DBCC CheckIdent 用於查看指定Table的當前ID值,並根據需要,修改其ID值。
DBCC CHECKIDENT( table_name [, { NORESEED | { RESEED [, new_reseed_value ] } } ]) [ WITH NO_INFOMSGS ]
1,查看ID列的當前ID值
dbcc checkident('table name',noreseed)
返回的消息是:Checking identity information: current identity value '517', current column value '517'.
2,如果ID列的最大值大於ID值,將ID值修改為ID列的最大值
DBCC CHECKIDENT ( 'table_name' ) --or DBCC CHECKIDENT ( 'table_name', RESEED )
3,將ID列的ID值修改指定的數值
DBCC CHECKIDENT ( 'table_name', RESEED, new_reseed_value )
四,查看最後一個插入的ID值
一個session含有不同的Scope,一個觸發器,一個存儲過程,一個batch,一個動態查詢語句都是是一個scope。在一個batch中執行多個存儲過程,就會產生多個作用域,@@IDENTITY返回的ID值是最後一個Scope產生的結果。如果要獲取當前Scope中插入的最後一個ID值,需要使用SCOPE_IDENTITY()。
MSDN:A scope is a module: a stored procedure, trigger, function, or batch. Therefore, two statements are in the same scope if they are in the same stored procedure, function, or batch.
根據Scope的不同,有兩個函數用於返回最後一個插入的ID值:
- @@IDENTITY:作用域是在當前Session中,返回最後一個插入的ID值
- SCOPE_IDENTITY():作用域是在當前的Scope中,返回最後一個插入的ID值
五,向ID列顯式插入指定數值
將Identity_Insert選項設置為ON,允許向ID列插入顯式數值。
SET IDENTITY_INSERT schema_name . table_name { ON | OFF }
如果插入的數值大於當前的ID值,SQL Server自動將當前的ID值設置為ID列的最大值。
If the value inserted is larger than the current identity value for the table, SQL Server automatically uses the new inserted value as the current identity value.
註意,在插入顯式數值時,必須將Target Table的所有列都顯式列出在Insert 子句中。
參考文檔:
SET IDENTITY_INSERT (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL)