文档章节

SQL SERVER ID标识列重新排列

浩爷
 浩爷
发布于 2016/04/12 14:14
字数 580
阅读 220
收藏 1

我们经常使用SQL ServerID自增长,也就是所谓的标识列来充当某张表的主键。这里有两个概念要澄清:

1. 标识列:可用 IDENTITY 属性建立,使应用程序开发人员得以对表中所插入的第一行指定标识数字(Identity Seed 属性),并确定要添加到种子上的增量(Identity Increment 属性)以决定后面的标识数字。在向具有标识符列的表中插入值时,通过递增种子值的方法自动生成下一个标识值。

2. 主键:可用primary key表示。唯一标识表中的所有行的一个列或一组列。主键不允许空值。不能存在具有相同的主键值的两个行,因此主键值总是唯一标识单个行。 

       那么,当我们表中的数据很多,又有些删除的操作时,标识列就不连贯了,我们如何让表中已有记录的标识列从1开始重新排列,并将标识列的下一个值设为记录数加1呢?下面我们以一张studentid identity(1,1) primary key,name,age)表为例。

(1) 清空表,标识种子置初值,这里要注意的是下面的语句会清空表中的所有原有数据。 

truncate table student

(2) 先要取消标识列,完成下面的语句后再将标识列加上,这样标识列又可以按顺序递增了。这里你可以直接使用企业管理器操作。

declare   @i   int
select   @i   =   0
update   student set @i = @i+1,id = @i

(3) 利用临时表,步骤就是将表中除id以外的数据拷贝到临时表中,再清空原表,插入临时表的数据,最后删除临时表。

--将数据倒入临时表

select  name,age   into   #   from  student   order   by   id

--清空源表,它同时会重置标识列

truncate   table   student

--将数据导回源表

insert   into   student   select   *   from   #

--删除临时表  

drop   table   #

在插入测试数据的时候一条一条记录的插入,这样太浪费时间,我们可以写一条循环语句加快测试速度:

declare   @i   int  
  set   @i=1  
  while   @i<=100  
        begin  
            insert   into   student   values   ('tbag'+cast(@i as varchar)
,25+@i)  
            set   @i=@i+1  
        end

© 著作权归作者所有

浩爷

浩爷

粉丝 7
博文 90
码字总数 49238
作品 0
深圳
程序员
私信 提问
sql server系统表详细说明

参考文献:sql server系统表详细说明 下列这些系统表都是存放在master数据库下的Views中,而不是在Tables中。 sysaltfiles 在特殊情况下,包含与数据库中的文件相对应的行。该表存储在 mast...

嗯哼9925
2017/12/20
0
0
不能将值 NULL 插入列 'id',表 'web.dbo.dingdan';列不允许有空值。...

错误现象: Microsoft OLE DB Provider for SQL Server 错误 '80040e2f' 不能将值 NULL 插入列 'id',表 'web.dbo.dingdan';列不允许有空值。INSERT 失败。 /Untitled-2.asp,行 115 原因分......

Java编程思想
2013/06/17
0
2
SQLServer系统变量使用

1、@@IDENTITY 返回最后插入的标识值。这个变量很有用,当你插入一行数据时,想同时获得该行的的ID(标示列),就可以用@@IDENTITY 示例:下面的示例向带有标识列的表中插入一行,并用 @@ID...

Yamazaki
2012/05/31
0
0
SQL SERVER重置自动编号列(标识列)

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

光石头
2010/08/07
0
0
Java调用BCP导入数据到数据库解决标识列ID问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://enetq.blog.51cto.com/479739/912093 前面的一篇博文讲解了调用bcp批量导...

fraya1234
2017/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

好文:华杉:我等用功,不求日增,但求日减。减一分人欲,则增一分天理,这是何等简易!何等洒脱!

#写在前面1.怎么理解“减一分人欲,则增一分天理,这是何等简易!”?1)华杉提倡 “一劳永逸” 排除浪费,少干活,多赚钱,一战而定,降低作业成本。2)华杉提倡学海无涯,回头是岸...

阿锋zxf
24分钟前
3
0
vue 的bus总线

bus声明 global.bus = new Vue() 事件发送 controlTabbar () {global.bus.$emit('pickUp', 'ddd')}, 事件接收 global.bus.$on('pickUp', (res) => {this.isFocus = true})......

Js_Mei
29分钟前
2
0
大型系统演进之路-负载均衡演进

Nginx做负载均衡 通过Nginx的反向代理将请求分发到tomcat中,如果tomcat支持100并发,Nginx支持50000并发,理论上nginx把请求发送到500个tomcat就可以了。 LVS或F5做多个Nginx负载均衡 Tomc...

春哥大魔王的博客
34分钟前
4
0
Sqlite时间段查询中遇到的问题

问题: 我要查询DateTime时间其中的一段符合时间要求的数据,比如我要查询‘2019-06-06 16:50:00’至‘2019-06-06 16:59:00’这一段的数据 开始用这段代码 strSql= ("select * from Coll...

rainbowcode
38分钟前
2
0
大数据(hadoop-数据入库系统Sqoop原理架构)

Sqoop是什么 Sqoop:SQL-to-Hadoop 连接传统关系型数据库和Hadoop的桥梁 把关系型数据库的数据导入到 Hadoop 系统 ( 如 HDFS、HBase 和 Hive) 中; 把数据从 Hadoop 系统里抽取并导出到关系型...

这很耳东先生
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部