解决MSSQL2012重启后自动编号字段ID自动增加10000的问题

我们在使用SQlServer2012数据库的时候,当数据库实例被重启后,表里的IDENTITY类型的字段,实际的跳转取决于该字段的类型,如果是INT类型,自动跳转为1000,如果是bigint,跳转为10000,从我们程序开发的角度,这个是无法接受的,目前只是在SQLServer2012种出现,其他版本的没有出现。

就在几天前,我们的一个工程师声称,我们一个IDENTITY列的值直接增加了10000,本来应该是2200现在是12001,现在我们必须解决这个问题。

按照道理,每次跳转的值不应该改变,于是开始找原因,最后解决了该问题。

我们进行问题重现。
我们安装一台新的SQL Server 2012的测试服务器,并且创建一个测试数据库。然后创建一个包含IDENTITY列的表:
create table MyTestTable(Id int Identity(1,1), Name varchar(255));
现在插入两条数据:
insert into MyTestTable(Name) values ('Mr.Tom');
insert into MyTestTable(Name) values ('Mr.Jackson');
然后通过下面的查询语句得到
SELECT Id, Name FROM MyTestTable;


目前的结果没有问题,现在我们只需要重启SQLServer服务,现在我们从SQL Server Management Studio重启服务。

解决MSSQL2012重启后自动编号字段ID自动增加10000的问题
现在我们将向这个表继续插入两条数据。
insert into MyTestTable(Name) values ('Mr.Tom2');
insert into MyTestTable(Name) values ('Mr.Jackson2');

这个时候进行数据查询,结果就成这样了:
解决MSSQL2012重启后自动编号字段ID自动增加10000的问题

当SQLServer2012的服务重启后,则标识从1002开始,这意味着它跳了1000,如果将字段设置为bigint,它会条高10000。


怎么会这样呢,如何解决,难道是bug,但是在咨询后,微软声称这个不是bug,是一个新的功能,在某些情况下可以受益,但是对我们来说这个是不允许的,因为客户端如果看到这样的数据,肯定会觉得是一个问题,现在跳转的数量取决于服务重启的次数,如果这个值在客户端不被看到,到还好,如果被看到,那肯定需要处理。
 解决方法有两个
1:使用序列
2:配置数据库实例的启动参数

1:使用序列
 现在我们移除Identity字段,然后创建一个序列字段,并插入值。
 CREATE SEQUENCE Id_Sequence
    AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 0
    NO MAXVALUE
   NO CACHE


 2:修改数据库实例的启动参数
 然后修改SQLServer启动参数,打开SQLServer configuration manager,然后选择服务实例,点击右键属性,查看实例的属性界面,然后启动参数选项输入-t272,然后保存数据后重启服务。这样就可以看到差别。

解决MSSQL2012重启后自动编号字段ID自动增加10000的问题
 这两个方法都可以解决,但是第一种方法可以对某一个库进行解决,而第二个修改后,将影响整个数据库。
 如果需要调整整个数据库,那么可以使用第二个解决方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值