假如一个表的主键为id(自动增长,初始值1,标识种子1)
当插入记录时每个记录的值是连续的:
1
2
3
当删除最后一条记录时
1
2
还没问题,问题在于——再插入记录时就变成了这样
1
2
4
还是3条记录,但序号却不连续了
有没有使序号连续的方法?

解决方案 »

  1.   

    写个插入存储过程 ,在插入数据时,获取ID最大的,然后插入的ID+1,如果为空,ID=1  
    ,如果删除中间记录,就写个触发器,循环修改删除记录以下所有ID,但是,如上所说,这有意义,性能的损失!!!
      

  2.   

    可以实现不过性能损失较大,不知道你的这个id是用来做什么的
    不过还可以有很多办法解决的
    如果只为了前台显示的时候好看的话,那就没必要了按数据插入时间order一下,然后自动生成一个id列显示出来把数据库里的那个id列隐藏掉就行了
      

  3.   

    是啊,这样是可以啊,但有没有Sql Server自身提供的自动使序号按顺序排列的方法?因为这个方法看起来比较折衷
      

  4.   

    哈哈,这个我知道啊,感觉Sql Server 应该有解决的方法,或许我们没发现,或许真的是Sql Server 设计上的疏忽,
    你试想一下,当你想数据库插入1000条记录,再删除这1000条记录,再插入1条记录,这时id为:1001,可只有一条数据,怎么感觉怪怪的……
    而且这是一种相对好的情况,试想一下:
    插入id:
    1
    2
    45
    删除最后一条记录:
    1
    2
    插入一条记录:
    1
    2
    46
     是不是很恶心呢
      

  5.   

    可以的
    CREATE TABLE dbo.Test(
       ID INT IDENTITY NOT NULL PRIMARY KEY, 
       Name VARCHAR(40) NOT NULL
    )
    GOINSERT INTO dbo.Test(Name) VALUES ('AA')
    INSERT INTO dbo.Test(Name) VALUES ('BB')
    INSERT INTO dbo.Test(Name) VALUES ('CC')
    INSERT INTO dbo.Test(Name) VALUES ('DD')
    GO
    --将BB删除,那么剩下1,3,4
    DELETE dbo.Tool 
    WHERE Name = 'BB'
    GO--将IDENTITY_INSERT设为ON,那么可以插入你想插入的值
    SET IDENTITY_INSERT dbo.Tool ON
    GO--又回到1,2,3,4了
    INSERT INTO dbo.Tool (ID, Name) VALUES (2, 'BB')
    GO
      

  6.   

    哦,错了,Tool没改为Test表名
      

  7.   

    15 楼 正解,
    还有14楼说的,sqlserver设计上的失误??????
    你都想的到,难道微软想不到???
      

  8.   

    INSERT INTO dbo.Tool (ID, Name) VALUES (2, 'BB')
    如果是这样的话,不是相当于你知道要插入第几条数据吗?如果是很多不连续的id,你难道要一个一个的指定id的值吗?
    不是我钻牛角尖,只是如果序号不连续的话,数据看起来很不整洁,很乱,应为我所做的软件要频繁的对数据进行操作,这样看起来很不雅观,我可能有点太追求完美了,不知道有没有好办法?
      

  9.   

    我怎么不知道呢?问题是我并没要求主键重复啊,我的原意是Sql Server有没有类似于内在排序(即假象sql Server知道该插入什么样的id值以确保id连续)或在对原有id进行有序化之后插入新记录的id以保证id有序?
      

  10.   

    不太明白,Sql Server的原理可能不太清楚,那按你的意思是这样吗:
    1
    2
    3
    当删了id为:2的记录后就不能再插入id为:2的记录了吗?
    可以这样理解吗?请多指教!
      

  11.   




    当删了id为:2的记录后就不能再插入id为:2的记录了吗? 
    ------------
    假如有另一个或多个表以外键关联这个id(这种情况是非常普遍的,很少有不与其他表关联的表存在)...例如你这个id为2的记录是一个商品A,关联的表是出入库记录...当你删除商品A再插入id为2的记录商品B,你的出入库记录可想而知把原来商品A的记录全都算到商品B的头上,用户不跟你发飙才怪...
      

  12.   

    好吧,再给你举个不关联的例子...假如这个id是个交费的票据号...开出id为2的票据,然后打印给用户张三去银行交钱...这时发现2出错了,于是删除它重开...不连续的话票据号就是4了,张三去交钱时查无此票号,那就告诉他回去查查再来...假如你id连续,删除2后轮到给李四开票,票据号却是2...假如张三比李四去的早刚好钱数又一样那就替李四交了...这就不是发飙的问题了,轻则投诉重则要打官司的!
      

  13.   

    记得执行一条命令就可以了,不用这样子吧
    去SQL区问问。