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
-------------------------------------------------------------------------------------------------------
IDENTITY_INSERT
SET?IDENTITY_INSERT?[TABLE]?[ON OFF]
参考百度问答:
① ? http://zhidao.baidu.com/question/412821404.html?qbl=relate_question_1&word=sql%D3%EF%D1%D4%D6%D0%B5%C4identity
② ? http://zhidao.baidu.com/question/486803939.html?qbl=relate_question_1&word=sql%D3%EF%D1%D4%D6%D0%B5%C4identity
默认IDENTITY_INSERT设置为off,identity列不需要赋值。如果使用sql语句为IDENTITY属性列赋值则会出现类似“仅当使用了列的列表,并且?IDENTITY_INSERT?为?ON?时,才能在表?'xxxxxxxxx'?中为标识列指定显式值。”的报错信息。
当设置为ON时,允许将显式值插入表的标识列中,这时可能在INSERT操作时手工指定插入到标识列IDENTITY中的编号,同时必须在操作完成后,将IDENTITY_INSERT还原成OFF,否则下次插入的时候必须指定编号,那不然就无法完成INSERT操作。
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/sql语言中的identity属性/
微信赞赏支付宝赞赏
发表评论