SQL中自己做标识列 (邹建原创)

来源:互联网 发布:域名历史查询 编辑:程序博客网 时间:2024/05/18 01:41

        如果使用系统的identity,会出现这样一种情况:当删除了一条记录,再增加一条新记录时会导致新增记录的id是记录中最大id+1.这样在现存的记录中id出现间断!所以,自己做一个标识列,目的就是弥补不足,出现上面情况时id自动更新,并连续。
注意:标识列是不允许修改其值的,所以如果你要实现删除后自动重排,就不能用标识列,否则会带来很多麻烦

--创建得到最大id的函数create function f_getid()returns intas   begin          declare @id int          select @id=max(id) from tb       set @id=isnull(@id,0)+1       return(@id)   endgo--创建表   create table tb(id int default dbo.f_getid() primary key,name varchar(10))   go--创建触发器,在删除表中的记录时,自动更新记录的id(**如果不要此功能,则删除此触发器)   create trigger t_delete on tb   AFTER delete   as      declare @id int,@mid int      select @mid=min(id),@id=@mid-1 from deleted      update tb set id=@id,@id=@id+1 where id>@mid  go--插入记录测试   insert into tb(name) values('张三')   insert into tb(name) values('张四')   insert into tb(name) values('张五')   insert into tb(name) values('张六')   insert into tb(name) values('张七')   insert into tb(name) values('张八')   insert into tb(name) values('张九')   insert into tb(name) values('张十')--显示插入的结果   select * from tb--删除部分记录   delete from tb where name in('张五','张七','张八','张十')--显示删除后的结果   select * from tb--删除环境   drop table tb   drop function f_getid/*--测试结果id          name      ----------- ----------1           张三2           张四3           张五4           张六5           张七6           张八7           张九8           张十(所影响的行数为 8 行)id          name      ----------- ----------1           张三2           张四3           张六4           张九(所影响的行数为 4 行)--*/


转自:http://www.cnblogs.com/youzhangjin/archive/2009/05/17/1458854.html