TSQL Identity 用法全解

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

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)

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: SQL Server
标签: TSQL, Identity, 标识列








本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/4798188.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
6月前
|
SQL HIVE
数仓面试重灾区之-Generic User-defined Table Generating Function(UDTF)
数仓面试重灾区之-Generic User-defined Table Generating Function(UDTF)
43 0
|
SQL 数据库
★SQL高级教程(2)——Alias、JOIN、INNER JOIN...(建议收藏)★上
★SQL高级教程(2)——Alias、JOIN、INNER JOIN...(建议收藏)★上
184 0
|
SQL
★SQL高级教程(2)——Alias、JOIN、INNER JOIN...(建议收藏)★下
★SQL高级教程(2)——Alias、JOIN、INNER JOIN...(建议收藏)★下
126 0
|
SQL 索引
【笔记】开发指南—DAL语句—CHECK GLOBAL INDEX
您可以使用CHECK GLOBAL INDEX语句检查主表和索引表的数据是否完全一致,并修订不一致的数据。
|
SQL 关系型数据库 MySQL
|
SQL Oracle 关系型数据库
SQL基础【十七、uuid()、sys_guid()、newid()】
SQL基础【十七、uuid()、sys_guid()、newid()】
454 0