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));
然后插入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。
真的是个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重现的操作,验证问题是否已解决。
如果太多的表包含数据库的标识列,并且所有表都包含现有值,则最好使用解决方案2。因为这是一个非常简单的解决方案,并且其范围是服务器明智的。 这意味着,如果在此处添加SQL Server 2012参数-t272,则会影响在那里的所有数据库。 如果要创建新数据库,并且需要自动生成的数字字段,则可以使用解决方案1,这意味着对列使用序列值而不是自动标识值。 您可以在网上找到很多文章,有关何时使用序列和彼此的优缺点时将使用自动标识列。 希望您阅读所有这些内容并做出适当的决定。
相关链接:https://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is
相关文章
- T-SQL教程_sql server 2008使用
- 定时自动释放SQL SERVER占用内存的方法
- SQL开发知识:Sql server中内部函数fn_PhysLocFormatter存在解析错误
- SQL Server 获取服务器时间的sql语句
- 人工智能自动sql优化工具–SQLTuning for SQL Server
- sql语句优化之SQL Server(详细整理)
- 轻松掌握:使用SQL Server执行SQL脚本(sqlserver执行sql脚本)
- SQL Server日期运算:加减法详解(sqlserver日期加减)
- SQL Server中如何简单快捷地创建表(sqlserver创表)
- SQL Server轮询:实现即时灵活的数据自动处理(sqlserver轮询)
- SQL Server语序:一种强劲的数据查询方式(sqlserver语序)
- SQL Server表映射——构建数据模型的灵活方式(sqlserver表映射)
- 使用SQL Server自动增量生成唯一ID(sqlserver自增量)
- SQL Server自动叠加:实现自动增量数据更新(sqlserver自增加)
- 动SQL Server自动启动:实现无门槛运行(sqlserver自启)
- 备份SQL Server自动备份:为数据保驾护航(sqlserver自动)
- 管理SQL Server结构管理:实现更高数据库效率(sqlserver的结构)
- SQL Server数据库管理:构建全面的企业信息保障(sqlserver数据库工具)
- 备份SQL Server 每小时自动备份实施细则(sqlserver按小时)
- 使用情况SQL Server年度使用情况分析报告(sqlserver 年度)
- SQL Server: 简单易用,用户体验卓越(sqlserver好用)
- SQL Server的基础学习概述(sqlserver大纲)
- 条件SQL Server使用必备前置条件(sqlserver前置)
- SQL Server 18:支持数据自动弹性伸缩(sqlserver18)
- serverMySQL 与 SQL Server 的比较与选择(mysql 和 sql)