问题描述
用.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要小写
非常不錯