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号?
对啊 那么set id=@id,@id=@id+1这句话产生的结果是什么?
set id=@id,@id=@id+1应该是被删的后面自动加一
update tb set id=@id,@id=@id+1 where id>@mid --原来行号为5的行 现在行号是不是变成2? 怎么回事你是把所有id>@mid 全部更改了,而不是更新一个ID
如果需要完美,最好插入一个临时表,把所有的ID,重新编下.再更新过来.如果ID不是主键的话
先对@id变量计算值.再对id列赋值..
先对@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的记录.
如果我把 这个 id 列定义为标识列 自增1 那么它会报错 就是不能和这个触发器同时存在
----------------------------------------------------------除排启用标识插入,否则标识列是只读的,不允许修改或显式指定值,而你的代码中有更新id,所以出错2,
有没有什么完美的办法 定义一个id列 我添加记录的时候 id 列中的值自动增1 我删除记录时 所有 id 号自动更新成新的有序id号?
----------------------------------------------------------
建一个iid 为标识列,id为计算列,计算方式为 count表中iid不大于当前记录的iid数。 也就是count计数法。或者不加标识列和计算机列,在 after delete触发器中, 找到被删除的记录的id, 使 表中id大于它的均-1. 如果是delete了多条,则复杂一些,多次操作就可以了。
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了