首页 新闻 会员 周边 捐助

sql server有关自增主键问题。

0
悬赏园豆:20 [已解决问题] 解决于 2012-07-19 09:23

最近碰到一个很坑爹的事情。

我数据库有张表,它又有一主键,有自增的属性(+1)。现在主键已经到了1543,其中不可避免有断层(就是主键ID 为100 或 112被删除)。

问题    情况一:我现在添加数据时主键ID 重新从1开始自增(这是我现在出现的问题,主键ID重新从1开始自增)。

    情况二:我现在添加数据时主键ID 是那些缺失的ID(弃)。

可惜我是程序员.的主页 可惜我是程序员. | 初学一级 | 园豆:93
提问于:2012-07-18 16:02
< >
分享
最佳答案
1

情况一:从1开始自增长只能通过Truncate Table清空所有数据。

情况二:使用 Set Identity_Insert 表名 Off 语句关闭 Id 列写入保护,手动写入断层Id,然后再 Set Identity_Insert 表名 On

收获园豆:5
飞扬的尘埃 | 小虾三级 |园豆:1318 | 2012-07-18 17:49

多谢各位的教育。这个问题俺通过 DBCC CheckIdent(Table,RESEED,ID)这个命令重新设定了Identity的值,这样自增就从现在的最大值开始增长了(即从1543开始)。

可惜我是程序员. | 园豆:93 (初学一级) | 2012-07-19 09:22
其他回答(3)
0

1. 要从1开始自增,需要用TRUNCATE TABLE清空表中所有数据。

2. 

a) 删除时不要直接删除,通过增加一个字段标识出已删除的记录。

b) 或者在代码中手动计算ID

收获园豆:5
dudu | 园豆:30778 (高人七级) | 2012-07-18 16:16

可以 确定没有用TRUNCATE TABLE删除,只是用了delete删除了几条数据而已。

补充   情况一:我现在添加数据时主键ID 重新从1开始自增(这个是我现在每添加一条数据它是重新从1开始自增的,现在已经添加到了5,即添加了5条数据了)

    情况二:我现在添加数据时主键ID 是那些缺失的ID(即我现在添加信息是替补了我删除的ID)

可能以上描述有问题导致 dudu 您老看花了眼,在此深感愧疚。

支持(0) 反对(0) 可惜我是程序员. | 园豆:93 (初学一级) | 2012-07-18 18:57

@烟雨中闲置: 看三楼飞扬的尘埃的回答

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2012-07-18 21:39

@dudu: 多谢各位的教育。这个问题俺通过 DBCC CheckIdent(Table,RESEED,ID)这个命令重新设定了Identity的值,这样自增就从现在的最大值开始增长了(即从1543开始)。

支持(0) 反对(0) 可惜我是程序员. | 园豆:93 (初学一级) | 2012-07-19 09:22
0

可以替换成Uniqueidentifier类型的字段 对应C#的类型是Guid  数据库中可以采用newId()来替代自动增长。

收获园豆:5
Tom.汤 | 园豆:3058 (老鸟四级) | 2012-07-18 16:31

多谢各位的教育。这个问题俺通过 DBCC CheckIdent(Table,RESEED,ID)这个命令重新设定了Identity的值,这样自增就从现在的最大值开始增长了(即从1543开始)。

支持(0) 反对(0) 可惜我是程序员. | 园豆:93 (初学一级) | 2012-07-19 09:22
0

最好的方法是删除的数据不要从表中移除,而是将其状态至为已删除。当然,试情况而定,如果是完关紧要的数据,可以直接删除。

收获园豆:5
jerry-Tom | 园豆:4077 (老鸟四级) | 2012-07-18 17:05

多谢各位的教育。这个问题俺通过 DBCC CheckIdent(Table,RESEED,ID)这个命令重新设定了Identity的值,这样自增就从现在的最大值开始增长了(即从1543开始)。

支持(0) 反对(0) 可惜我是程序员. | 园豆:93 (初学一级) | 2012-07-19 09:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册