sql server数据库主键自增一次增长了1000多

问题描述

用.net做的一个信息管理系统,用的sqlserver数据库,把主键设置了自增,增量为1,如果是今天向表中添加信息,会按照逐条加1增长,但是明天如果再添加的话,主键的值就会比上一条数据多出1000多,搞不懂这是为什么,求大神帮忙!!附图:

解决方案

解决方案二:
看看你表设计另外事务中添加的时候,就算回滚了,自增还是会体现到数据库的
解决方案三:
确定增量为1,应该有频繁的插入删除操作。
解决方案四:
设计就是按正常设计的,在添加信息的时候也没有用到事务操作
解决方案五:
插入失败,回滚时,等下次插入,数据表的自增字段会增加失败或是混滚的值加上你当初的值.
解决方案六:
而且我这不是一个表这样,好像整个数据库的表都这样
解决方案七:
那看看第三天插入数据时是不是从2001开始感觉楼主的问题很奇怪一般来时不会这样的
解决方案八:
楼上还真说对了,就是这个样子,根据上面几位说的,我看了自己的代码,怎奈小弟我刚刚出道,技术水平太低,还没找到原因
解决方案九:
你插入数据时,自增长的字段不要插入数据,让SQLSERVER给你自动插入,如果你主动插入自增长字段,会在你最大的数据上面加1
解决方案十:
重新建表,ID自增,在试试
解决方案十一:
引用8楼allstudycsharp的回复:

你插入数据时,自增长的字段不要插入数据,让SQLSERVER给你自动插入,如果你主动插入自增长字段,会在你最大的数据上面加1

+1sqlserver的增长机制跟oracle不一样oracle用的序列,每次从序列里去取,跟你表里存了什么无关.如果你当前序列值是100,你手动插入个101进去,下次自动插入的时候就会报错而sqlserver本身按你当前内容最大值累加
解决方案十二:
请问你是每过一天数据id都是以1000为单位增长吗?
解决方案十三:
我也遇到这个情况了,目前无解,整个表都是。求大神现身
解决方案十四:
引用楼主changzufang的回复:

用.net做的一个信息管理系统,用的sqlserver数据库,把主键设置了自增,增量为1,如果是今天向表中添加信息,会按照逐条加1增长,但是明天如果再添加的话,主键的值就会比上一条数据多出1000多,搞不懂这是为什么,求大神帮忙!!附图:

谁跟你说过自增字段保证这个字段值连续的?自增字段就是“保证数值不减小”而已。如果你以为自增字段是做业务流水号的,那是你理解错误。
解决方案十五:
比如说你的1004号,你可能永远看不到了,它在存储过程、触发器、删除语句、系统维护中被用过了。自增字段本来就是断断续续的,不是连续的!
解决方案:
如果要写“一种情况”的测试,你可以并发5个程序去向数据表里分别写10条数据,然后让第4个程序的第8条事务回滚(或者别的什么“跳出”做法),尽管此时你根本没有Commit(提交)事务,你可以100%地看到这个数值序列中间至少跳了1、2号,不可能是连续的。人家自增字段本来就是很随意地“自增”的,根本没费力气去给你保证连续性,根本没有这个功能。
解决方案:
以前也经常这样做,不过还没遇到过这样的情况啊,给楼主顶起来,学习学习!!
解决方案:
看看是不是你在事务中插入的时候,出异常以后事务没有回滚???
解决方案:
自增长的数值出现后,再删除,再插入,不会继续用这个值的,会取该表已经出现过的自增长的最大数据加1,无论这个最大的数据在不在了。。。除非truncate表从1重新开始比如1,2,3,把3删除了,下次再插入就会从4开始,3这个值表里面是看不到的,也不会再用的。
解决方案:
1.总是每次加1,但是有什么东西去删除?2.有无什么事务没提交或者回滚?
解决方案:
这是个普遍问题,而且总发生在SQL服务,或者服务器重启之后。
解决方案:
http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is解决方案见上面网址,国内网站也提到该解决方案,但有的把t大写了,导致设置无效,特别强调,t要小写
解决方案:
是不是你定义的时候该了
解决方案:
引用13楼sp1234的回复:

Quote: 引用楼主changzufang的回复:
用.net做的一个信息管理系统,用的sqlserver数据库,把主键设置了自增,增量为1,如果是今天向表中添加信息,会按照逐条加1增长,但是明天如果再添加的话,主键的值就会比上一条数据多出1000多,搞不懂这是为什么,求大神帮忙!!附图:

谁跟你说过自增字段保证这个字段值连续的?自增字段就是“保证数值不减小”而已。如果你以为自增字段是做业务流水号的,那是你理解错误。

2012新增功能,看看这个吧http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is
解决方案:
1、自增列,不应赋予什么特殊意义,可以作为主键,但是不要作为业务字段2、每次执行一次插入动作,自增都会自动加1,你把插入的记录干掉,自增当前值也不会回来的
解决方案:
正因为把插入的记录干掉,自增当前值也不会回来,这样就保证了他的唯一性,所以合适用来作为业务字段
解决方案:
引用23楼top8843的回复:

2012新增功能,看看这个吧http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is

晕!还“新增功能”?删除这一列然后重建这一列,这算是解决吗?这是添乱啊。
解决方案:
如果你只是在自己的单机上测试,你可以随便折腾什么“自增列”,你可以在系统日志上做些重新初始化、数据库系统启动时做些初始化。但是编程者应该考虑到将来这种应用是跑在多用户并发访问的情况下,而且几个月都不会重启一次,要保证一直云运行,那些单纯考虑单用户使用、自己可以随便“删除列、再重建列”的做法,都是无意义的。多用户访问时,自增列必定会经常跳号的。因为自增列只保证自增,而不保证连续!
解决方案:
引用楼主changzufang的回复:

用.net做的一个信息管理系统,用的sqlserver数据库,把主键设置了自增,增量为1,如果是今天向表中添加信息,会按照逐条加1增长,但是明天如果再添加的话,主键的值就会比上一条数据多出1000多,

你贴出的图中,有增加900的,有增加2的,没有增加1000多的。而且从1005跳到1007,这也是“正常”常见的现象,说明恰好此时有并发数据库事务操作或者数据库事务回滚动作了。你只是说“比上一条数据多出1000,那么就有人去盲目去网上搜索”sqlserver自增列增加1000“这个词儿了。
解决方案:
引用26楼sp1234的回复:

Quote: 引用23楼top8843的回复:
2012新增功能,看看这个吧http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is

晕!还“新增功能”?删除这一列然后重建这一列,这算是解决吗?这是添乱啊。

反正这不是BUG,是微软从SQL2012开始,故意这么设计的。至于你说删除这一列,再重建,那值都变了,还有何意义,而且如果不添加启动参数,-t272,重建列之后,还是会出现跳跃的。也不是你所说的:“它在存储过程、触发器、删除语句、系统维护中被用过了”,即使新建的表,随便插入几条数据,其他什么都不做,重启SQL服务,也是会跳跃的。我就将就用谷歌翻译一下:========================FromSQLServer2012version,whenSQLServerinstanceisrestarted,thentable'sIdentityvalueisjumpedandtheactualjumpedvaluedependsonidentitycolumndatatype.Ifitisinteger(int)datatype,thenjumpvalueis1000andifbiginteger(bigint),thenjumpvalueis10000.Fromourapplicationpointofview,thisincrementisnotacceptableforallthebusinesscasesspeciallywhenthevalueshowstotheclient.Thisisthespecialcase/issueshipswithonlySQLServer2012andolderversionshavenosuchissue.=================从SQLServer2012版本中,当SQLServer实例重新启动,则表的IDENTITY值跳起来,实际跳下值取决于标识列的数据类型。如果它是整数(INT)数据类型,然后跳到值是1000,如果大的整数(BIGINT),然后跳值为10000。从我们的应用程序的角度来看,这个增量是无法接受的所有的商业案例特别是当值示给客户端。这是特殊情况/问题仅随SQLServer2012的和旧版本有没有这样的问题。
解决方案:

解决方案:
这是正常的,是重启数据库服务造成的,ID跳1000是给数据同步预留的。比如两台服务器做了数据同步,其中一台服务器要重启,重启的过程中另一台服务器有新的数据插入,这1000的Id就是预留给新数据的,以避免两台服务器数据冲突。如果只有一台服务器不需要同步数据,可以配置管理器中加上启动参数-t272,重启服务后就不会跳ID了
解决方案:
网上搜一下,启动参数-t272。但是重启之后第一次还是这样,你可以用一个test表测试好了再重启一次。
解决方案:
我晕,现在的Sqlserver还有这样的事呀
解决方案:
自增列会跳变,一般是数据库服务重启导致。sybase有类似问题,但有个identity_gap属性可以强制设置跳变为1
解决方案:
我的数据库表也出现这种问题,数据交互用EF。不知道什么原因这个主键自增ID就会跳很明显求解决方案
解决方案:
引用21楼top8843的回复:

http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-column-Value-Jump-Is解决方案见上面网址,国内网站也提到该解决方案,但有的把t大写了,导致设置无效,特别强调,t要小写

非常不錯

时间: 2024-09-20 09:53:41

sql server数据库主键自增一次增长了1000多的相关文章

从Oracle数据库到SQL Server数据库主键的迁移

oracle|server|数据|数据库 由于项目需要要将以前Oracle的数据库转化为SQL Server,今天利用SQL Server的DTD进行数据库的迁移,但导入以后发现只导入了表结构和数据,而表的一些主键约束都没导过来,感觉很郁闷,而手头又没有好的迁移工具,如Erwin,所以动手写了个小工具,基本实现了主键的转移,主要代码如下:主要控件:     ADOConnOrcale: TADOConnection;  //连接Oracle    ADOConnSQLServer: TADOCo

SQL Server数据表字段自定义自增数据格式的方法_MsSql

本文实例讲述了SQL Server数据表字段自定义自增数据格式的方法.分享给大家供大家参考,具体如下: --修改数据表SYS_Company中字段CompanyId自定义自增约束 ALTER TABLE [dbo].[SYS_Company] Add Constraint DF_SYS_Company_CompanyId DEFAULT ([dbo].[f_PrimaryCode_SYS_Company]()) FOR [CompanyId] --Go --删除约束 Alter table SY

SQL Server数据表字段自定义自增数据格式的方法

本文实例讲述了SQL Server数据表字段自定义自增数据格式的方法.分享给大家供大家参考,具体如下: --修改数据表SYS_Company中字段CompanyId自定义自增约束 ALTER TABLE [dbo].[SYS_Company] Add Constraint DF_SYS_Company_CompanyId DEFAULT ([dbo].[f_PrimaryCode_SYS_Company]()) FOR [CompanyId] --Go --删除约束 Alter table SY

谈数据库主键选取策略

INT和GUID,究竟选谁? 关于数据库主键的选取策略,大家都是在INT和GUID两者中徘徊.忘了那些喋喋不休的争论吧!毕竟鱼与熊掌,不可兼得.在这篇文章中,我们不再关注它们的优缺点,自觉先行做点功课哦! 如小标题,如果真要选,我会选谁?肯定地说,我会选GUID,又或者两者都选上.后者情形下,使用GUID做主键.INT做小二,INT在业务层生成,这要即使重复了,也不碍事,且INT是要反馈给前端的,定时做一个防冲突检测.如果让用户记忆或反馈那GUID字符串(去连接字符后32位),可以直接去跳楼了!

小议sqlserver数据库主键选取策略_MsSql

因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除的时候不会出现张冠李戴的错误.当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了.主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致.所以数据库在设计时,主键起到了很重要的作用. 常见的数据库主键选取方式有: 自动增长字段 手动增长字段 UniqueIdentifier "COMB(Combine)"类型 一.自动增长型字段 很多数据库设计者喜欢使用自动增长型字段,因为它使用简单.

SQL Server数据全同步及价值分析[终结版]

SQL Server数据全同步[终结版] 版权所有,转载请注明出处,谢谢! 经过两天的同步编写和测试,出了第一个Release版本: 1. 本函数仅支持单向同步,即从一个主数据库想多个从数据库同步 2.主数据库的任何增删改都会同步到所有从数据库上 3. 最重要的一点:同步数据库的价值所在:当主数据库服务器不可用时,程序可以使用其他从数据库或者备用数据库,这对于未来公有云和私有云应用具有重大价值! 代码: <span style="font-size:18px;">/// &

在SQL Server中对视图进行增删改

原文:在SQL Server中对视图进行增删改 Lesktop开源IM发布以后,有一些网友问及如何在嵌入IM后与自己网站的用户系统整合(即如何让嵌入的IM直接使用网站原有的用户数据库,而不需要将已有的用户数据导入到IM的数据库中).Lesktop对Users表(存储用户登录名,昵称,密码等信息的表)都是在存储过程中进行增删改的,显然,如果直接去改Users表相关的存储过程是比较麻烦的,本文将介绍一种较为简单的方法,在不需要修改存储过程和源代码的情况下整合用户系统. 为实现这个目的,先介绍一下在S

ASP实现备份sql server数据

server|sql|备份|数据 建个bak文件夹啊,放数据! db.asp代码如下: <%dim conndim connstr'on error resume nextset conn=server.CreateObject("adodb.connection")connstr="Provider=SQLOLEDB;data source=192.168.2.1;UID=sa;Pwd=123;DataBase=test"conn.Open connstr

使用SQL Server数据服务开发功能强大且可扩展的应用程序

本文使用了以下技术: SQL Server 本文将介绍以下内容: SSDS 数据模型 管理实体.容器和颁发机构 创建示例 Web 应用程序 类序列化和反序列化 本专栏基于 SQL Server 数据服务的预发布版本撰写而成.文中包含的所有信息均有可能发生变更. 目录 SSDS 数据模型 构建分类广告系统 添加城市 添加类别 更新和删除实体 添加和删除列表架构 分类 Web 应用程序 类反序列化 使用自定义列表架构