好幾天沒來了.把下面的在你的Query Analyzer中執行,你就明白該怎麼做了:
create table why
(
id1 int identity(1,1),
name1 varchar(100)
);
go
insert into why values ('ning');
insert into why values ('parker');
insert into why values ('wzp');
insert into why values ('huiler');
insert into why values ('lxw');
go
select * from why;
go
delete from why where id1 = 3;
go
select * from why;
go
select * into #temp1 from why;
go
truncate table why;
go
insert into why select name1 from #temp1;
go
select * from why;
go

解决方案 »

  1.   

    方法2:
    假設刪除的紀錄為第3條.delete from why where id1 = 3;
    select * into #temp1 from why where id1 > 3;
    delete from why where id1 > 3;
    dbcc checkident(why,reseed,2);
    insert into why select name1 from #temp1;
    如果考慮多用戶,那麼對表加鎖.
    操作完就釋放鎖.
      

  2.   

    哦,竹之草兄谢谢了,随便问一句:
    在删除了后有什么方法可以设置IDENTITY的增长基数的?因为如果用上面的办法的话,再INSERT数据进去就会出现断层,有什么方法可以解决吗,还有就是如何在触发器中进行加锁?如何写?
      

  3.   

        我认为这个问题出现的原因是你的表结构的问题。如果你要实现你说的那个功能。最好的方法是改变表结构。把identity去掉,用触发器实现就可以了。不然也许没有好办法了,因为identity最的优点就是不能插入数据。
      

  4.   

    dbcc checkident(why,reseed,2);  
    --強制重置表why的identity字段的當前值為2,如果你建表時設的增長幅度為1的話,那麼下一條插入的輸入為3
      

  5.   

    dbcc checkident(why,reseed,2);  
    --強制重置表why的identity字段的當前值為2,如果你建表時設的增長幅度為1的話,那麼下一條插入的數值為3
      

  6.   

    我建议不用identity自增长的数据类型  ,直接用INT  可能好处理些。
    比如你的数据库中有1、2、3。500条记录,
    删除第三条后,用
    update why set 序号 =序号-1 where 序号>3 
    就可以了,不算太复杂。
      

  7.   

    hackerning(勤学) :不一定要用户输入,在程序中生成这个序号。在添加新记录时,先得到最大ID号,+1后生成insert 语句执行添加记录的过程。
      

  8.   

    单用户很好解决,用icevi(按钮工厂)的方法完全可以。如果多用户,就比较麻烦了。另外还有数据量的问题,KingSunSha(弱水三千)的建议值得考虑。
      

  9.   

    就把序号设为INT,为WHY编写插入删除更新触发器来改变序号不是更简单吗?
      

  10.   

    Sunny21cn(毛头) 说的有道理,关键是hackerning(勤学)还是想这样做,用自动编号不好解决的。
    其实用我的办法也有不好的地方,因为要用update ,涉及的记录很多,又都是要改关键字段,一般都需要锁定这些记录的,锁定记录也会增加服务器的开销,经常这样做,我怕服务器会吃不消的。所以想问一下hackerning(勤学),不知道为什么一定要这样处理ID号?能用其它方法避免这个问题最好。
      

  11.   

    呵呵,这是编写要求,我也没办法:)还有就是用触发器的办法有问题,具体的问题请看
    http://www.csdn.net/expert/topic/320/320829.shtm
    如果解决了一定重谢:)各位兄弟,谢谢了!!!
      

  12.   

    不管什么处理方法,服务器的开销都不会少,什么人设计的啊?把Identity 这样用?真是有创意。哎!我不相信什么系统非要这样处理不可。
      

  13.   

    那你说有什么好的解决办法吗:)如果不用 IDENTITY的花?
      

  14.   

    icevi(按钮工厂):
    能留下你的QQ号码或者其他什么的吗?一起交流一下?QQ:764332
      

  15.   

    update why set 序号 =序号 -1 where 序号 =:序号 
    当然了,前提是不用identity,或者执行上一句时,首先关掉identity,完了,在开启
      

  16.   

    如果要找某一个序号的上一个,不如用
    where 序号=(select min(T.序号) from Table T where (T.序号 < 序号))
    子查询虽然效率低一些,但总比一个一个更新要有效。
    实在要连号,不如写一个程序,再每周或每天定期执行。