加载中…
个人资料
以无为名
以无为名
  • 博客等级:
  • 博客积分:0
  • 博客访问:328,974
  • 关注人气:55
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

sql中的identity

(2014-06-07 22:12:19)
标签:

sql

identity

备忘

分类: 杂学
引用介绍:在数据库中, 常用的一个流水编号通常会使用 identity 栏位来进行设置, 这种编号的好处是一定不会重覆, 而且一定是唯一的, 这对表中的唯一值特性很重要, 通常用来做客户编号, 订单编号等功能。

个人理解:
一张表中保存了很多条记录,一般都在表中定义一个递增的列,为了防止重复使用identity属性是一个非常好的解决方法。其中identiyi列不可修改只能删除,而且是不断递增的。

假如有以下表(表名为test):
1 a A
2 b B
3 c C
4 d D
5 e E
6 f F
7 g G
假如第一列(数字列)为identity属性。、
使用sql语句                 dbcc checkident('test', NORESEED)   其中test为表的名字
可以查看identity 栏位最大值是7 (这句语句无任何破坏性,可放心使用)

假设先使用delete语句删除第5、7列 后,再insert一列 (identity列不需要也不能赋值)
结果就是:
1 a A
2 b B
3 c C
4 d D
6 f F
8 h H

新增的列并不会自动在当前列的最大序数上+1而是会在存在sql系统的某个空间的值+1(这个值就是 使用 dbcc checkident('test', NORESEED) 查询出来的值,它不受sql增加删除等普通sql语句的影响


那么怎么改变这个值呢?
使用  dbcc checkident('test',RESEED,8)    (使用该语句应当小心谨慎,一旦设置错误可能会造成不可预料后果)

执行完上面的语句identity值就被会修改为8, 如果设置的identity值比目前表中的最大序数小时係统仍会接受, 但若 identity 遇上重覆资料时(如将 identity 设为主键属性时), 将会发生重大问题, 这时候就只能将目前的 identity 修復, 直接使用 
dbcc checkident('test', RESEED) 或  dbcc checkident('test') 


假设上面删除第5、7列后 ,再使用语句  dbcc checkident('test',RESEED,6) 
那么当前最大的identity值就是6,也就是test表中最大的序数6!因为原先的最大7已经删除。
这时候执行insert操作,下一列的序数就是6+1,这样的话就是连续的了(你会发现第五列没了,因为你删除了,如果还要让序号完全连续,可以试试把4列后的每条数据备份下来,然后删除4后面的所有列(前面说了identity属性列不能修改),然后再修复identity的值为4!然后再一次插入你备份下来的那几条数据,就可以得到一张连续的表了)。
1 a A
2 b B
3 c C
4 d D
6 f F
7 h H





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有