SQL Server 2012自动标识列值跳转问题[亲测有效]

SQL Server 2012自动标识列值跳转问题[亲测有效]在SQL Server 2012版本中,当重新启动SQL Server实例时,表的身份值将被跳转,而实际跳转的值取决于身份列数据类型。 如果是整数(int)数据类型,则跳转值为1000;如果为大整数(

SQL Server 2012自动标识列值跳转问题

简介

  在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));

代码100分

  然后插入2行数据

代码100分insert into MyTestTable(Name) values ("Mr.Tom");
insert into MyTestTable(Name) values ("Mr.Jackson"); 

  然后查看结果

SELECT Id, Name FROM MyTestTable; 

SQL Server 2012自动标识列值跳转问题[亲测有效]

  结果是预期的。 现在,只需重新启动SQL Server服务即可。 您可以通过多种方式进行操作。 我们是从SQL Server Management Studio完成的。

SQL Server 2012自动标识列值跳转问题[亲测有效]

重启之后,我们向刚才的表格再插入2条数据

代码100分insert into MyTestTable(Name) values ("Mr.Tom2");
insert into MyTestTable(Name) values ("Mr.Jackson2");

查看结果

SELECT Id, Name FROM MyTestTable;

SQL Server 2012自动标识列值跳转问题[亲测有效]

  现在你看到重启SQL Server 2012 之后的结果,它的自增列的值从1002开始了。 也就是跳跃了 1000。之前说过,如果我们自增列的数据类型是 长整型(bigint)的话,它的跳跃值就将会是 10000。

真的是个Bug吗?

  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重现的操作,验证问题是否已解决。

SQL Server 2012自动标识列值跳转问题[亲测有效]

 

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

 

相关链接:https://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9173.html

(0)
上一篇 2023-02-14
下一篇 2023-02-14

相关推荐

  • 录屏教学软件哪个好_录制教学视频用什么软件

    录屏教学软件哪个好_录制教学视频用什么软件**需要录制教学视频?**最近,吉林新增4例本土病例,内蒙古新增1例境外输入病例。所以现在很多省市的学生还是不能返校,需要在家看教学视频的,那有人会用软件录制教学视频以备回放,所以小编今天推荐一款好…

    2023-03-05
    116
  • 聊聊荣耀30S 5G手机到底值不值得买?

    聊聊荣耀30S 5G手机到底值不值得买?     最近和群里不少小伙伴聊了聊荣耀30S的问题,很多人都在问荣耀30S 5G手机值不值得买?我的答案是肯定的。有钱买苹果、买三星,那都是梦里,现实生活的人们都是希望在有限的预算中购买到性价比最…

    2023-02-13
    102
  • Python类的定义和使用

    Python类的定义和使用
    Python中的类是一种自定义数据类型,允许我们定义自己的数据结构,包括数据属性(成员变量)和方法(成员函数),并支持面向对象编程中的封装、继承和多态等特性。类是一种模板,可以通过实例化获得对象,每个对象具有相同的属性和方法,但这些属性可能具有不同的值。

    2023-12-26
    60
  • python中的一段习题(python第一章课后题答案)

    python中的一段习题(python第一章课后题答案)1:

    2023-11-02
    94
  • 疫情间如何远程办公?[通俗易懂]

    疫情间如何远程办公?[通俗易懂]疫情还在继续。随着春节假期的到来,远程办公可能又是一个热门话题。去年疫情爆发时,数千家公司被迫进入不熟悉的在家办公的文化领域,但企业网盘客户的适应速度明显快于其他公司,因为疫情爆发前,他们已经通过企…

    2023-04-11
    124
  • 重庆哪里有开餐饮费发票

    重庆哪里有开餐饮费发票电薇13530507261 保-真,可-先-幵-验,陈经理。链接与装载是一个比较晦涩的话题,大家往往容易陷入复杂的细节中而难以看清问题的本来面目。从本质上讲各个系统的编译、链接、装载过程都是大同小异…

    2023-02-16
    116
  • Python数字比较:如何比较Python数字并进行逻辑判断

    Python数字比较:如何比较Python数字并进行逻辑判断在Python中进行数字比较是很常见的操作,不仅可以进行简单的大小比较,还可以进行逻辑判断,例如判断一个数字是否在某个范围内。本文将从多个方面介绍Python数字比较。

    2024-02-20
    49
  • 深入了解Python字典的值(Value)用法和技巧

    深入了解Python字典的值(Value)用法和技巧在Python中,字典是一种非常常用的数据类型。它是由若干个键值对组成的无序集合。字典中每个键都唯一对应一个值,这个值可以是任意的Python对象,如数字、字符串、列表、甚至是其他字典。字典的值(Value)作为字典中的数据元素之一,其操作和使用方法非常重要。

    2024-04-08
    25

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注