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)

IDENT_CURRENT (Transact-SQL)

最新文章

  1. 深入SpringMVC
  2. Spring整合Ehcache管理缓存
  3. 【USACO 3.1】Humble Numbers(给定质因子组成的第n大的数)
  4. 基于SolrCloud的内容搜索和热点推送
  5. Jboss7.1 加入realm auth认证 bootsfaces 美化的登录页面
  6. CLR via C#(07)-静态类,分部类
  7. win7 vmware 无法使用usb
  8. android使用Intent操作拨打号码发送短信
  9. KEIL 伪指令
  10. Flash AIR 保存与读取
  11. 对 Xcode 菜单选项的详细探索(干货)
  12. 你真的会玩SQL吗?Top和Apply
  13. UVa 324 - Factorial Frequencies
  14. Android图表库MPAndroidChart(十)——散点图的孪生兄弟气泡图
  15. 线性回归预测PM2.5----台大李宏毅机器学习作业1(HW1)
  16. Scanner对象及其获取数据出现小问题和解决方案
  17. 服务器资源迁移到aliyun对象存储及oss的权限管理配置
  18. 使用kermit通过串口升级uboot
  19. 作业四:个人项目-小学四则运算之JAVA版
  20. 初识大数据(三. Hadoop与MPP数据仓库)

热门文章

  1. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
  2. 使用ServiceStack构建Web服务
  3. Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇
  4. 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
  5. X86和X86_64和X64有什么区别?
  6. Java 输出流中的flush方法
  7. jQuery学习之路(5)- 简单的表单应用
  8. iOS开发之Masonry框架源码深度解析
  9. pdo的使用
  10. select、poll、epoll之间的区别总结