create trigger t_delete on tb
AFTER delete
as
declare @id int,@mid int
select @mid=min(id),@id=@mid-1 from deleted  --比如说你的程序中删除了行 3 4 6 8  那么此时@id 值是不是为2?update tb set id=@id,@id=@id+1 where id>@mid  --原来行号为5的行  现在行号是不是变成2?  怎么回事  
go我对这段代码的理解哪里有错? 请指出来!还有  如果我把 这个 id 列定义为标识列 自增1 那么它会报错 就是不能和这个触发器同时存在  有没有什么完美的办法 定义一个id列  我添加记录的时候 id 列中的值自动增1 我删除记录时 所有 id 号自动更新成新的有序id号?

解决方案 »

  1.   


    对啊  那么set id=@id,@id=@id+1这句话产生的结果是什么?
      

  2.   


    set id=@id,@id=@id+1应该是被删的后面自动加一
      

  3.   


    update tb set id=@id,@id=@id+1 where id>@mid  --原来行号为5的行  现在行号是不是变成2?  怎么回事你是把所有id>@mid  全部更改了,而不是更新一个ID
    如果需要完美,最好插入一个临时表,把所有的ID,重新编下.再更新过来.如果ID不是主键的话
      

  4.   


    先对@id变量计算值.再对id列赋值..
      

  5.   


    先对@id变量计算值.再对id列赋值..
    如果不明白..
    可以自己做个实验..declare @t table(id int)insert @t values(1)
    insert @t values(2)declare @i int
    set @i=5   update @t 
          set id=@i,   --先写对列赋值,再写对变量计算值.
              @i=@i+5
       
       select * from @t
       
    godeclare @t table(id int)insert @t values(1)
    insert @t values(2)declare @i int
    set @i=5   update @t 
          set @i=@i+5,  --先写计算变量值,再写对列赋值.
              id=@i     
       select * from @t 然后按Ctrl+L看执行计划...
    可以看到..两个计划是一样的..
    因为优化程序会先处理计算变量值..再对列进行赋值..所以..set id=@id,@id=@id+1
    会先得到@id=2+1=3..然后再将3赋值给id..也就是行号为4的记录.
      

  6.   

    1,
    如果我把 这个 id 列定义为标识列 自增1 那么它会报错 就是不能和这个触发器同时存在  
    ----------------------------------------------------------除排启用标识插入,否则标识列是只读的,不允许修改或显式指定值,而你的代码中有更新id,所以出错2,
    有没有什么完美的办法 定义一个id列  我添加记录的时候 id 列中的值自动增1 我删除记录时 所有 id 号自动更新成新的有序id号? 
    ----------------------------------------------------------
    建一个iid 为标识列,id为计算列,计算方式为 count表中iid不大于当前记录的iid数。 也就是count计数法。或者不加标识列和计算机列,在 after delete触发器中, 找到被删除的记录的id, 使 表中id大于它的均-1. 如果是delete了多条,则复杂一些,多次操作就可以了。
      

  7.   


    select @mid=min(id),@id=@mid-1 from deleted  --那么此时@id 值是2update tb set id=@id,@id=@id+1 where id>@mid  
    --原来行号为5的行  现在行号变成3  因为@id=2, @id=@id+1就为3 id=@id 就为3了(具体的可以看6楼的演示)
    --原来行号为7的行  现在行号变成4  因为@id=3, @id=@id+1就为4 id=@id 就为4了