IDENTITY,就是Sql Server中的“标识”列,Access中的自动编号,不过这篇文章主要讨论的都是sql Server中的内容。
主要包括:
一、获取刚刚添加的那条记录的IDENTIT值(通常都是为了获取编号)
二、重设IDENTITY列的新值
一、获取刚刚添加的那条记录的IDENTIT值(通常都是为了获取编号)
1、下面这段来自于SQL SERVER 2000的联机丛书
IDENT_CURRENT 类似于 Microsoft® SQL Server™ 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY。
这三个函数都返回最后生成的标识值。
但是,它们在定义"最后"的作用域和会话上不同。
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
2、下面这段来自于我今天的亲身体会
今天的情况首先是添加餐馆后,无论如何都不能获得刚刚生成的identity,后来又莫名其妙的好用了。
天知道是怎么回事!
然后是添加餐馆之后获取的identity和实际的值不匹配。
后来想起,添加餐馆的时候,后自动为这外餐馆生成“肉菜”、“酒水”等5个默认的分类。
所以添加完餐馆后,通过SCOPE_IDENTITY 获取的identiy实际上是分类的ID。后来改成SELECT IDENT_CURRENT('Restaurant')解决问题。
二、重设IDENTITY列的新值
这部分是参考了一篇博客:
重设标识列(identity)种子 (http://www.cnblogs.com/Echang/articles/1115166.html)
文章中提到的是,将表里面的数据清空,然后恢复identity从1开始。
我接着试验了数据没有完全清空的情况。
假设删除一些记录之后,现有的记录是 2 3 5 8,新的将从20开始 ,那么运行之后 DBCC CHECKIDENT (MyTable, RESEED, 1) GO 提示“检查标识信息: 当前标识值 '20',当前列值 '1'。
再次添加,就出来Identity为1的记录。
继续添加,就会报错,这时是2,再添加,还报错,再添加就变成4了。
再添加,再报错(5),再添加,出来6、7、再添加,又出错。
再添加出来9,10,就开始正常了。
结果,让我感觉系统还是很“笨”的,我原本以为那个1,可以让identity从8+1=9开始呢。
结果,出了几回错,竟然把空缺的给补满了。
结论,如果表里还有记录,就不要DBCC CHECKIDENT (MyTable, RESEED, 1)从1开始。