文档章节

关于sqlsever标识值与@@IDENTITY的整理

蔬菜kiki
 蔬菜kiki
发布于 2017/08/25 11:50
字数 1811
阅读 3
收藏 1
点赞 0
评论 0

SQL Server中的标识值

SQL Server中的标识列又称标识符列,习惯上又叫自增列。

该种列具有以下三种特点:
1、列的数据类型为不带小数的数值类型;
2、在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值
3、列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列。 
这个标识列上的值就是标识值。 

SQL2005中设置自动编号字段

修改列的标识属性

在对象资源管理器中,右键单击要更改其数据类型的列所在的表,再单击“修改”。此时,将在表设计器中打开该表。

1、清除要更改的列的“允许空”复选框。

2、在“列属性”选项卡中,展开“标识规范”属性。

3、单击“是标识”子属性的网格单元格,然后从下拉列表中选择“是”。

4、在“标识种子”单元格中键入值。此值将赋给表中的第一行。默认情况下将赋值 1。

5、在“标识增量”单元格中键入值。此值是基于“标识种子”依次为每个后续行增加的增量。默认情况下将赋值“1”。 

例如,假设要为添加到 orders 表的每行自动生成 5 位 Order ID,从 10000 开始并且每次递增 10。为此,应在“标识种子”中键入 10000,在“标识增量”中键入 10。

如果更改表的任何标识属性,则将保留现有的标识值。新的设置值仅应用于添加到表中的新行。

注意:

如果频繁执行删除操作的表中存在标识列,则标识值之间会出现不连贯的情况。

若要避免出现这种不连贯的情况,请不要使用标识属性。

当您在网格单元格外单击或使用 Tab 键移动到其他网格单元格后,“标识规范”属性的新值将赋给表设计器中的列。当您在表设计器中保存更改时,这些值将在数据库中生效。

1. 创建表时指定自动编号的字段 CREATE TABLE [dbo].[UserInfor](  [UserID] [int] IDENTITY(100,2) NOT NULL,  [UserName] [nchar](10) NOT NULL, )  说明:创建一个用户信息表UserInfor,并指定UserID为自动编号字段。其中:IDENTITY(100,2)表示字段的初始值为100,每次增量为2,如输入数据后第一次为100,第二次为102。

2.获取自动编号的字段值

这里可以使用@@IDENTITY取得自动增加字段主键的值

(3)重新设置自动编号字段种子的起始值 如果用户将带有自动增加字段的表内容清空,由该字段的起始值将从原有的值开始增加,可以通过DBCC命令重新设置起始值。   DBCC CHECKIDENT (UserInfor,RESEED,0) 将UserInfor表的自动增加字段种子起始值设置为0,插入一条数据后自动字段的值为0+增量,如增量为1,则值为1

 ----------------------------------------------

右键你的表-->设计表-->找到你的id字段(类int型)-->标识-->是-->标识种子(初始值)-->标识递增量-->OK

---------------------------------

create table mytest  (  id int primary key identity(1,1),--主键,自动+1  name varchar(20) unique not null,--不允许重复,不允许为空  Age tinyint,  notetime smalldatetime default getdate()  ) 

insert into mytest values ('张三',20,getdate()) 
insert into mytest (name,age)values ('李四',20)

-------------------------------------------

select @@identity的用法  

在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

   在返回插入到表的@@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT函数类似。

    @@IDENTITY 和SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

    IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。

    示例

下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。

    INSERT INTO infoclass (infoclass) VALUES ('Accountant')

这时我们插入一条记录,下面我们使用语句得到标识值:

    SELECT @@IDENTITY AS 'Identity'

我的表infoclass中有个ID字段,它原的值是14插入新的记录后自动产生了值15,因些,上面命令执行后返回值:15。

    下面说说如何在.net中得到插入记录后的ID值。

    因为Sqlserver为我们提供了多重查询的功能,这大大方便了我们的工作。请看:

    Dim sql As String = "INSERT INTO jobs (job_desc,min_lvl,max_lvl) VALUES ('A new job', 25, 100);" & _

"SELECT job_id FROM jobs WHERE job_id = @@IDENTITY"

Dim cmd As New SqlCommand(sql, cn)

    上面可以看到,SqlCommand可以执行多条语句,各语句之间用“;"分隔。第一条执行插入,第二条则返回最后插入记录的ID值,因为查询返回的是单列的,并且值也是唯一的,所以可以使用ExecuteScalar获得:

Dim jobId As Integer = CInt(cmd.ExecuteScalar())A

2. insert into 后获得自动插入的id(select @@identity)

当运行完插入语句后,执行select   @@identity就可得到自动生成的id

如果是sql server 最好用select SCOPE_IDENTITY() as id

因为@@identity全局的

同类还有IDENT_CURRENT(‘table’)

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。

@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。

SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

 @@ERROR 在SQL存储过程

返回与@@ERROR 最近的语句错误码,局限于DML语句和select语句,如果执行他们出现错误,则返回一个不等于0的错误码,如果没有出错,则返回0。通常使用它来判断语句有没有执行成功。 如:if @@ERROR<>0
                   begin
                       select  1000
                       return
                  end
表示如果@@ERROR 执行出现问题,存储过程返回自定义代码1000后退出。

© 著作权归作者所有

共有 人打赏支持
蔬菜kiki
粉丝 1
博文 11
码字总数 4093
作品 0
杭州
程序员
Sql Server返回自增字段值的一些注意点

最近在整理自己封装的一个轻量级ORM数据访问框架的时候,遇到这样一个问题,在插入表中的一条记录时,往往需要返回插入这条记录的主键,如果主键是自增的话,就需要返回这个自增值。 那么Sql...

从前
2013/06/05
0
0
在SQL SERVER中获取系统生成的标识值

在SQL SERVER中可以使用三种方法来获取系统生成的标识值: @@IDENTITY、SCOPEIDENTITY 和 IDENTCURRENT 这三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。 ...

晨曦之光
2012/03/09
0
0
小心使用@@identity

@@identity的作用是返回最后插入的标识值,所以有很多朋友使用它来获取插入数据后的标识符。 但有一点是需要注意的,@@identity返回的是最后的标识符,所以,要想正确的返回插入后的标识符,...

鉴客
2012/03/14
87
0
@@IDENTITY,IDENT_CURRENT,SCOPE_IDENTITY,IDENT_INCR,IDENT_SEED详解

@@IDENTITY 返回最后插入的标识值的系统函数。 IDENTCURRENT( 'tablename' ) 返回为指定的表或视图生成的最后一个标识值。所生成的最后一个标识值可以针对任何会话和任何作用域。 SCOPE_IDEN...

技术小甜
2017/11/09
0
0
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY

SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPEIDENTITY、IDENTCURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。 IDENTCURRENT 返回为任何会话和任何作用域中的特...

余二五
2017/11/23
0
0
SQL SERVER ID标识列重新排列

我们经常使用SQL Server的ID自增长,也就是所谓的标识列来充当某张表的主键。这里有两个概念要澄清: 1. 标识列:可用 IDENTITY 属性建立,使应用程序开发人员得以对表中所插入的第一行指定标...

浩爷
2016/04/12
212
0
C# insert into 一条记录后获取该记录的自动增长列ID

1.创建的表结构 id列为自动增长列 create table test ( id int identity(1,1) not null, name nvarchar(20) ) 2. 发现 SELECT SCOPE_IDENTITY() 即为该自动增长ID C#中直接在插入操作之后 in...

aehyok
2012/10/19
0
0
SQL SERVER重置自动编号列(标识列)

两种方法: 一种是用Truncate TRUNCATE TABLE name 可以删除表内所有值并重置标识值 二是用DBCC CHECKIDENT DBCC CHECKIDENT ('tablename', RESEED, newreseed_value) 如dbcc checkident ("b......

光石头
2010/08/07
0
0
SQL Server提示“第 1 行 当 IDENTITY_INSERT 设置为 OFF ...”错误解决方案

SQL Server提示:消息 544,级别 16,状态 1,第 1 行 当 IDENTITYINSERT 设置为 OFF 时,不能为表 'accesslog' 中的标识列插入显式值。是因为表中有主键或者其中有一个列使用了identity(1,...

不最醉不龟归
2016/09/24
175
0
Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block

开发人员经常编写需要安全功能的应用程序。这些应用程序通常需要执行一系列不同的安全操作,而且它们还经常与不同的基础安全提供程序(如 Microsoft Active Directory 目录服务、授权管理器、...

老朱教授
2017/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
4
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
165
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部