TSQL 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 子句中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!