SQL2000中有一张表tb1,字段只有2个分辨是编号(主键,自动增长),姓名
先往里面录入100条数据后,然后随机删除其中的10条(编号随机),这样编号就断了(例如:1001,1002,1004,1007,1019…………),然后再插入新的数据后,编号是否可以从第一个断的后面继续(1003),而不是从1101(编号)开始,不知道重置语句是否可以完成 dbcc checkident(tb1,reseed,1000) 但是再insert数据时,系统会提示1001已经存在,主键不能重复,要执行该insert into语句3编,才能使编号从1003开始,在线等待,谢谢各位

解决方案 »

  1.   

    dbcc checkident是个坏主意,不可取。
    --设置可以显式插入标识值
    set identity_insert tb1 on
    declare @id int
    --取得断号
    select @id = min(编号)+1 from tb1 a where not exists (select 1 from tb1 where a.编号+1 = 编号)
    insert tb1(编号,姓名) values(@id, '')
    set identity_insert tb1 off
    记得结贴哦
      

  2.   

    2楼说的对,最好不要自增。否则查找缺失很麻烦。如果已经是自增列了,那么可以像1楼那样查找每次的缺失:
    --设置可以显式插入标识值
    set identity_insert tb1 on
    declare @id int
    --取得断号
    select @id = min(编号)+1 from tb1 a where not exists (select 1 from tb1 where a.编号+1 = 编号)
    insert tb1(编号,姓名) values(@id, '')
    set identity_insert tb1 off
      

  3.   

        如果为了避免大面积的修改程序和数据库结构,你可以参考一下这样:
        不要直接删除数据了,加一个标识字段(找一个数据表中的未用的字段也行),需要删除的记录更新这个字段,再新增记录的时候先查找被标识的记录 UPDATE 就行了。     这样的弊端就是数据库中会保留一些无用的记录。
      

  4.   

    这个只能是做成存储过程了 但是我想得到@id这个值 而不是在这个存储过程里头insert tb1(编号,姓名) values(@id, '')