我建立了这样一张表  有三个字段  其中id是序号是根据我写入数据的顺序排列的 
id      name      result 
0      张三        78 
1      李四        72 
2      王五        82 
3      孙六        91 我想实现:在我删除行 2  王五  82  之后 
行3  孙六  91自动递补上去 这张表即是: 
id      name      result 
0      张三        78 
1      李四        72 
2    孙六          91 怎么实现呢? 

解决方案 »

  1.   

    --创建测试表
    CREATE TABLE t1(ID int IDENTITY,A int)
    GO
    --插入记录
    INSERT t1 VALUES(1)
    GO--1. 将IDENTITY(标识)列变为普通列
    ALTER TABLE t1 ADD ID_temp int
    GOUPDATE t1 SET ID_temp=ID
    ALTER TABLE t1 DROP COLUMN ID
    EXEC sp_rename N't1.ID_temp',N'ID',N'COLUMN'
    INSERT t1 VALUES(100,9)
    GO--2. 将普通列变为标识列
    CREATE TABLE t1_temp(ID int,A int IDENTITY)
    SET IDENTITY_INSERT t1_temp ON
    INSERT t1_temp(ID,A) SELECT * FROM t1
    SET IDENTITY_INSERT t1_temp OFF
    DROP TABLE T1
    GOEXEC sp_rename N't1_temp',N't1'
    INSERT t1 VALUES(109999)
    GO--显示处理结果
    SELECT * FROM t1
    /*--结果:
    ID          A 
    ----------------- ----------- 
    1           1
    100         9
    109999      10
    --*/
      

  2.   

    ID 是自增?
    如果這樣沒有必要
    查詢的時候生成就好了
    2000
    select ID=(select count(*) from tb where ID<=t.ID),
           name,
           result
    from tb t
    2005
    select ID=row_number()over(order by (select 1)),  
           name,
           result
    from tb 
      

  3.   

    SELECT IDD=IDENTITY(INT,1,1),* INTO #T FROM TB?
      

  4.   

    如果不是IDENTTIY列用UPDATE
    UPDATE TB SET ID=(
    SELECT COUNT(1) FROM TB T2 WHERE T2.ID<ID
    )
      

  5.   

    create table #temp(id identity(1,1) ,name nvarchar(30),result nvarchar(20))
    insert into #temp (name,result)
    select name ,result 
    from 你的表
    order by id
      

  6.   

    个人意见:
    楼主的这种需求很不好。
    如果仅仅是为为了查询:wufeng4552的方案很好
    如果必须得在表里实现,你想啊:数据量大、并发多了 后 无论何种处理(fredrickhu的重新生成表、或者利用触发器实现等)都会引起锁问题,且性能很差!
      

  7.   

     参看fcuandy前辈的办法:利用触发器实现标识列连续。(支持批量插入) 
      

  8.   

    -------INSTEAD OF 触发器还可以帮助你实现自增列的功能        USE tempdb;
            GO
            IF OBJECT_ID('dbo.T1') IS NOT NULL
              DROP TABLE dbo.T1;
            GO
            CREATE TABLE dbo.T1
            (
              keycol  INT NOT NULL PRIMARY KEY,
              datacol VARCHAR(10) NOT NULL
            );
            GO
            --创建Sequence表来保留最新的列值
            IF OBJECT_ID('dbo.Sequence') IS NOT NULL
              DROP TABLE dbo.Sequence;
            GO
            CREATE TABLE dbo.Sequence(val INT NOT NULL);
            INSERT INTO dbo.Sequence VALUES(0);
            GO
            --建立触发器 
            CREATE TRIGGER trg_T1_ioi_assign_key ON dbo.T1 INSTEAD OF INSERT
            AS
            DECLARE @rc AS INT, @key AS INT;
            SET @rc = @@rowcount;
            --如果是0行 则返回
            IF @rc = 0 RETURN; 
            --更新你的Sequence表 @key存储Sequence表的值,记住还要把Sequence表的值更新到最新的列值
            UPDATE dbo.Sequence SET @key = val, val = val + @rc;
            --插入T1表 更新的列值
            INSERT INTO dbo.T1(keycol, datacol)
              SELECT @key + ROW_NUMBER() OVER(ORDER BY getdate()), datacol
              FROM (SELECT datacol FROM inserted) AS I;
            GO
            --插入测试
            INSERT INTO dbo.T1(datacol)
              SELECT LastName FROM Northwind.dbo.Employees;
            SELECT keycol, datacol FROM dbo.T1;
            /*
            keycol      datacol
            ----------- ----------
            1           Buchanan
            2           Callahan
            3           Davolio
            4           Dodsworth
            5           Fuller
            6           King
            7           Leverling
            8           Peacock
            9           Suyama*/
    参考这个吧 
      

  9.   

    上面的贴错了你这个既然设计为IDENTITY 就要承受这个短号的 缺陷。。
    如果你不想断号。。换其他方式替代IDENTITY
    然后用触发器
      

  10.   

    如果你要用IDENTITY类型,就不能频繁的修改它,否则容易出问题
    如果只作定期维护,还是可以考虑
    方法参照2楼,