【每日一记6】+第17天 SQL Server 2012自动标识列值跳转问题
  

新手781833 4144

{{ttag.title}}
本帖最后由 新手781833 于 2020-4-19 19:23 编辑

    在SQL Server 2012版本中,当重新启动SQL Server实例时,表的身份值将被跳转,而实际跳转的值取决于身份列数据类型。 如果是整数(int)数据类型,则跳转值为1000;如果为大整数(bigint),则跳转值为10000。从我们的应用程序角度来看,此增量不适用于所有业务案例,尤其是当该值 。 这是仅SQL Server 2012附带的特殊情况/问题,较早的版本没有此问题。

背景
  几天前,,表的标识列之一跳了10000。这意味着该表的最后一个标识值是2200,现在是12001。

代码如下
  第一次,我们都对这种可能性感到惊讶和困惑。 我们通常不会在标识列中插入任何值(可以将值插入标识列)。 标识值由SQL Server本身维护。

解决方案。
  您需要设置SQL Server 2012并创建测试数据库。 然后创建一个带有自动标识列的表:
create table MyTestTable(Id int Identity(1,1), Name varchar(255));
  然后插入2行数据
insert into MyTestTable(Name) values ('Mr.Tom');
insert into MyTestTable(Name) values ('Mr.Jackson');
  然后查看结果
SELECT Id, Name FROM MyTestTable;
  结果是预期的。 现在,只需重新启动SQL Server服务即可。 您可以通过多种方式进行操作。 我们是从SQL Server Management Studio完成的。
.

重启之后,我们向刚才的表格再插入2条数据
insert into MyTestTable(Name) values ('Mr.Tom2');
insert into MyTestTable(Name) values ('Mr.Jackson2');
查看结果
SELECT Id, Name FROM MyTestTable;
  现在你看到重启SQL Server 2012 之后的结果,它的自增列的值从1002开始了。 也就是跳跃了 1000。之前说过,如果我们自增列的数据类型是 长整型(bigint)的话,它的跳跃值就将会是 10000。

  Microsoft宣称它是功能而不是错误,并且在许多情况下会有所帮助。 但是在我们的情况下,这是不可接受的,因为该数字会显示给客户端,并且客户端会惊讶地看到跳转后的新数字,而新数字取决于重新启动SQL Server的次数。 如果客户端看不到它,则可以接受,以便在内部使用该号码。

解决方案
如果我们对微软提供的这个 “功能” 不感兴趣,我们可以通过两种途径来关闭它。
1. 使用序列 (Sequence)
2. 为SQL Server 注册启动参数 -t272
使用序列
首先,我们需要移除表格的自增列。然后创建一个不带缓存功能的序列,根据此序列插入数值。 下面是示例代码
CREATE SEQUENCE Id_Sequence
    AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 0
    NO MAXVALUE
   NO CACHE
insert into MyTestTable values(NEXT VALUE FOR Id_Sequence, 'Mr.Tom');
insert into MyTestTable values(NEXT VALUE FOR Id_Sequence, 'Mr.Jackson');
注册启动参数 -t272

打开SQL Server配置管理器。 选择 SQL Server 2012 实例,右键, 选择属性菜单。在弹出的窗口中找到启动参数,然后注册 -t272。 完成之后重启下图中的SQL Server(SQLSERVER2012), 之后进行bug重现的操作,验证问题是否已解决。





     如果太多的表包含数据库的标识列,并且所有表都包含现有值,则最好使用解决方案2。因为这是一个非常简单的解决方案,并且其范围是服务器明智的。 这意味着,如果在此处添加SQL Server 2012参数-t272,则会影响在那里的所有数据库。 如果要创建新数据库,并且需要自动生成的数字字段,则可以使用解决方案1,这意味着对列使用序列值而不是自动标识值。 您可以在网上找到很多文章,有关何时使用序列和彼此的优缺点时将使用自动标识列。 希望您阅读所有这些内容并做出适当的决定。

打赏鼓励作者,期待更多好文!

打赏
2人已打赏

小鱼儿 发表于 2023-11-5 14:39
  
学习了!感谢分享!!
小西北 发表于 2023-11-5 14:35
  
学习了!感谢分享!!
鲤鲤 发表于 2023-11-5 14:35
  
学习了!感谢分享!!
日出 发表于 2023-11-5 14:29
  
学习了!感谢分享!!
小德 发表于 2023-11-5 14:29
  
学习了!感谢分享!!
飞飞侠 发表于 2023-11-5 14:20
  
学习了!感谢分享!!
德德 发表于 2023-11-5 14:20
  
学习了!感谢分享!!
梦境人生 发表于 2023-11-5 14:13
  
学习了!感谢分享!!
小小胖 发表于 2023-11-5 14:13
  
学习了!感谢分享!!
发表新帖
热门标签
全部标签>
西北区每日一问
技术盲盒
安全效果
每日一问
【 社区to talk】
干货满满
技术笔记
GIF动图学习
产品连连看
新版本体验
技术咨询
2023技术争霸赛专题
功能体验
自助服务平台操作指引
每周精选
通用技术
安装部署配置
秒懂零信任
信服课堂视频
标准化排查
排障笔记本
玩转零信任
答题自测
原创分享
技术晨报
社区新周刊
POC测试案例
畅聊IT
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
高手请过招
升级&主动服务
高频问题集锦
全能先锋系列
云化安全能力

本版达人

新手89785...

本周建议达人

新手78183...

本周分享达人