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

相关推荐

  • MySQL重置超级管理员密码「建议收藏」

    MySQL重置超级管理员密码「建议收藏」1. 修改数据库配置文件 vim /etc/my.cnf — 添加如下参数 skip_grant_tables 2. 重启数据库 /etc/init.d/mysqld restart 3. 登录数…

    2023-02-07
    147
  • Python Mapping Essentials

    Python Mapping Essentials在现代技术中,地图信息是至关重要的。在生产、运输、安全等领域,地图是一个非常重要的工具。Python开发者可以使用各种库来推动地图应用的开发,例如:基于Google Maps、OpenStreetMap等地图数据源的开发。在本文中,我们将介绍使用Python开发地图应用所需的必要技能和知识方面,并将涉及一些有关地图数据采集、分析和可视化的功能。

    2024-05-07
    71
  • 使用Python计算圆周率的平方根

    使用Python计算圆周率的平方根圆周率(π)是一个几何常数,它代表了一个圆的周长与其直径的比值,通常近似值为3.14。圆周率的平方根是指其平方根的值,通常表示为√π。圆周率的平方根在数学和物理学中广泛应用,如波长、频率、圆柱体表面积、球体体积和质量等。

    2024-02-08
    101
  • Python中的文件关闭方法

    Python中的文件关闭方法在Python中,文件是一个重要的概念, Python提供了许多文件读写操作的API函数。使用完文件后,我们需要及时地关闭文件,释放资源。Python中关闭文件的方法有多种,下面我们将分别介绍。

    2024-01-05
    108
  • Python编程中的交集操作

    Python编程中的交集操作在Python编程中,交集操作是指取两个或多个集合中共有的元素构成一个集合的操作。在实际应用中,交集操作经常被用来解决数据分析中的问题。例如,找到两个数据集中的重复数据,或者从两个数据集中找到共同拥有的元素。

    2024-06-10
    53
  • 如何查看PyCharm版本

    如何查看PyCharm版本作为一名Python工程师,我们经常使用PyCharm这款IDE进行代码开发,而不同的PyCharm版本具有不同的功能和特性,因此了解自己使用的PyCharm版本是非常重要的。本文将介绍如何查看当前 PyCharm 的版本号,帮助读者更好地掌握自己的工具。

    2024-08-16
    30
  • 如何卸载anaconda虚拟环境

    如何卸载anaconda虚拟环境Anaconda是一个用于科学计算的Python发行版,并且自带有众多常用的库和工具。在使用Anaconda安装Python及其库之后,有时需要卸载Anaconda及其虚拟环境。本文将详细阐述如何卸载Anaconda虚拟环境。

    2024-09-15
    27
  • 使用Shell清空文件内容的方法

    使用Shell清空文件内容的方法
    在进行日常工作中,我们经常需要对文件进行处理,有时候需要清空文件内容,但是很多人不知道如何用Shell来实现这一操作。本文将详细介绍如何使用Shell来清空文件内容,帮助读者解决相关问题。

    2024-05-13
    70

发表回复

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