学习写第一个SQL server触发器
在最近的程序中,有一个字段表示排序,1~N的。但却不能是自增的类型,因为用户可以交换这个排序的先后的。
如果已经记录的order是:1,2,3,4,5,6
如果删了1,3,4的话,余下的记录变成了2,5,6,这不太符合要求,我希望记录始终从1开始,并且中间不能间断,即便你删了134,剩下记录的order还要是1,2,3
起初做到存储过程中,当删除的时候对其重新排序,后来一想,触发器不是更好吗?
于是就有了:
CREATE TRIGGER [reorderAfterDel]
ON [dbo].[Categories]
AFTER DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @left int;
declare @i int;
select categories,orders into #categoriesTemp from [dbo].[Categories];
select @left=count(*) from #categoriesTemp;
set @i=1;
while(@left>0)
begin
declare @minOrder int;
select @minOrder=min(orders) from #categoriesTemp;
if(@minOrder>@i)
begin
update [dbo].[Categories] set orders=@i where orders=@minOrder;
end
delete from #categoriesTemp where orders=@minOrder;
set @i=@i+1;
set @left=@left-1;
end
drop table #categoriesTemp;
END
ON [dbo].[Categories]
AFTER DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @left int;
declare @i int;
select categories,orders into #categoriesTemp from [dbo].[Categories];
select @left=count(*) from #categoriesTemp;
set @i=1;
while(@left>0)
begin
declare @minOrder int;
select @minOrder=min(orders) from #categoriesTemp;
if(@minOrder>@i)
begin
update [dbo].[Categories] set orders=@i where orders=@minOrder;
end
delete from #categoriesTemp where orders=@minOrder;
set @i=@i+1;
set @left=@left-1;
end
drop table #categoriesTemp;
END
现在无论怎么删,剩余的order总是从1开始的,并且中间不间断了。
来源:http://99love.blueidea.com/archives/2007/5332.shtml

浙公网安备 33010602011771号