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)

TSQL Identity 用法全解的更多相关文章

  1. [推荐]T- SQL性能优化详解

    [推荐]T- SQL性能优化详解 博客园上一篇好文,T-sql性能优化的 http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html

  2. CSS样式设置语法全解,样式优先级、值和单位、字体、文本、块级元素,行内元素,替换元素、非替换元素、display、float、position、table、li、光标、边距边框、轮廓、颜色背景

    全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 CSS样式设置语法全解: 样式优先级 1. !important标记的样式 > 内联样式(sty ...

  3. T- SQL性能优化详解

    摘自:http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册 ...

  4. T-SQL查询进阶--详解公用表表达式(CTE)

    简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的. 但是,视图是作为系统对象存在数据库中,那对于结果 ...

  5. Join 和 Apply 用法全解

    在关系型数据库系统中,为了满足第三范式(3NF),需要将满足“传递依赖”的表分离成单独的表,通过Join 子句将相关表进行连接,Join子句共有三种类型:外连接,内连接,交叉连接:外连接分为:left ...

  6. laravel操作Redis排序/删除/列表/随机/Hash/集合等方法全解

    Song • 3563 次浏览 • 0 个回复 • 2017年10月简介 Redis模块负责与Redis数据库交互,并提供Redis的相关API支持: Redis模块提供redis与redis.con ...

  7. Q_INVOKABLE与invokeMethod用法全解

    在Qt/Qt Quick宏浅议一文中,我们将介绍Qt中经常使用的几个宏: Q_OBJECT, SIGNAL与SLOT, Q_SIGNALS 与 Q_SLOTS, Q_EMIT ,Q_INVOKABLE ...

  8. php利用ob缓存机制实现页面静态化方法全解

    首先介绍一下php中ob缓存常用到的几个常用函数 ob_start():开启缓存机制 ob_get_contents():获取ob缓存中的内容 ob_clean()清除ob缓存中的内容,但不关闭缓存 ...

  9. Java main方法全解

    1.main方法的重载 package cn.nxl2018; public class Main_test { public static void main(String args[]) { Sy ...

随机推荐

  1. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  2. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  3. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  4. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  5. html5 与视频

    1.视频支持格式. 有3种视频格式被浏览器广泛支持:.ogg,.mp4,.webm. Theora+Vorbis=.ogg  (Theora:视频编码器,Vorbis:音频编码器) H.264+$$$ ...

  6. Android studio使用gradle动态构建APP(不同的包,不同的icon、label)

    最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...

  7. Linux常用命令

    命令格式与目录处理命令 ls 命令格式与目录处理命令 ls 命令格式:命令 [-选项][参数] 例:ls -la /etc 说明: 1)个别命令使用不遵循格式 2)当有多个选项时,可以写在一起 3)简 ...

  8. javascript运动学教程

    本文系笔者学习原生javascript动效的笔记.内容基于某非著名培训机构的视频教程.并重新做了归类整理.删除了一些过时的内容.并重做了GIF图,加上了自己的一些分析. 一. 运动学基础 引子:从左到 ...

  9. CYQ.Data V5 分布式自动化缓存设计介绍

    前方: 其实完成这个功能之前,我就在思考:是先把想法写了来,和大伙讨论讨论后再实现,还是实现后再写文论述自己的思维. 忽然脑后传来一个声音说:你发文后会进入发呆阶段. 所以还是静下心,让我轻轻地把代码 ...

  10. ReactNative入门(安卓)——API(下)

    LayoutAnimation - layout动画 当布局发生改变时的动画模块,它有两个方法: 1. 最常用的方法是 LayoutAnimation.configureNext(conf<Ob ...