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

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


-- 创建得到最大id的函数
  create   function  f_getid()
returns   int
as
  
begin
          declare  @id  int
          select  @id = max (id)  from  tb
      
set  @id = isnull (@id, 0 ) + 1
      
return (@id)
  
end
go

--创建表
   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 行)
--
*/

 

转载于:https://www.cnblogs.com/youzhangjin/archive/2009/05/17/1458854.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值