sql server 2005 主键自动增长的替代方案

项目背景:

一个运行的项目进行维护,遇到了这样一个问题。客户安装了一个网闸,对数据库的表有一个要求就是:不能有自动增长的字段。项目中有一些表是自动增长的,所有必需把它改成非自动增长的。

解决方案:

 

思路:通过触发器 对有自动增长的表进行insert拦截,然后做取值最大值 +1  做为主键在插入到库里。

 

过程中:

 原来的记录要回滚 要不记录就多了。而且 因为非自动增长  也会报主键为null的错误。

想到用rollback  可是 应用会抓错。想到 插入一条记录 在删掉  虽然效率差点 不过也实现了 呵呵

修改 主键为非自动增长 默认值为0  这样 就可以随便插入了。然后 删除 主键为0的记录

 

但是在数据库 已经有 主键为0的 记录 也会出错  所有之前要做些处理。

数据库没有记录 也会出错 因为 max  出错。所有 没有记录的时候 插入以下 主键为1 的 当然 之后 要删掉

很累  呵呵

 

下面 是代码

 


create trigger zfhf_test_tri
--数据库名称
on [dbo].zfhf_test
--触发方式
for insert

as
-- 表中存在主键为0 的记录
begin  
 if exists(select * from zfhf_test  where id=0)
 begin
delete from zfhf_test  where id=0
 end

--
declare @noResult as int
set @noResult=0
 
  declare @myID as int  

  declare @myName as varchar(20)  

--表中没有任何记录
 if not exists(select * from zfhf_test)
 begin
 declare @seName as varchar(20) 
  select @seName = name from inserted
 insert into zfhf_test(id,name)values(1,@seName)
set @noResult=1
 end


  select @myID = max(id) from zfhf_test 
   select @myName = name from inserted
--添加记录  主键自动增长
  insert into zfhf_test(id,name)values(@myID+1,@myName)
--删除 插入的主键为默认值0 的记录
  delete from zfhf_test where id=0
--删除 插入的主键为默认值1的记录 在数据库不存在记录的情况下 而插入的记录
if(@noResult=1)
begin
  delete from zfhf_test where id=1
end

return
end

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值