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属性/

赞赏

微信赞赏支付宝赞赏

发表评论