连续序列号中断后的处理两种处理方法

本文介绍了一种在SQL Server中实现编号连续处理的方法,通过触发器和存储过程两种方式,确保了即使在删除某些记录后,编号也能保持连续,适用于SQL Server 2000和2005版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 功能:中断ID的连续处理                              *
 * 适用:SQL Server 2000 / SQL Server 2005           *
 * 返回:NONE                                         *
 * 作者:Flystone                                     *
 * 日期:2008-05-13                                    *
 
*/

-- 问题引入
/*
表﹕test 
字段: u_no char(2), 
      u_nameid char(5) 

---u_no-----------u_nameid------- 
    01               A0001 
    02               B8921 
    03               F8762 
    . 
    99               ..... 

比如我刪除了行66 就是u_no為66的行,表紀錄成了: 

---u_no-----------u_nameid------- 
    01               A0001 
    02               B8921 
    03               F8762 
    . 
    65 
    67 
    . 
    99               ..... 

我要讓u_no自己補齊刪除的數字﹐如下所示 
---u_no-----------u_nameid------- 
    01               A0001 
    02               B8921 
    03               F8762 
    . 
    . 
    . 
    65 
    66 
    . 
    98               ..... 

*/

--环境准备



create table test(u_no char(2),u_nameid char(5))

insert into test select '01','A0001' union select
    
'02' ,              'B8921' union select 
    
'03'  ,             'F8762' union select
    
'04',               'C2345' union select
    
'05',               'C2345' union select
    
'06',               'C2345' union select
    
'07',               'C2345' union select
    
'08',               'C2345' union select
    
'09',               'C2345'
go
--方法一:触发器
create trigger tr_deleteid
on test
for delete
as
begin
    
declare @i int,@c int
    
select @I = min(cast(u_no as int)),@c = count(1from deleted
    
update test
    
set u_no = right('00'+ltrim(cast(u_no as int- @c),2)
    
where u_no > @i
end
go
--原始记录
select * from test
/*

u_no u_nameid 
---- -------- 
01   A0001
02   B8921
03   F8762
04   C2345
05   C2345
06   C2345
07   C2345
08   C2345
09   C2345

(所影响的行数为 9 行)
*/

--单条删除
delete from test where u_no = '02'
select * from test
/*
u_no u_nameid 
---- -------- 
01   A0001
02   F8762
03   C2345
04   C2345
05   C2345
06   C2345
07   C2345
08   C2345

(所影响的行数为 8 行)
*/

--批量删除开始
delete from test where u_no between '02' and '04'
select * from test

/*

u_no u_nameid 
---- -------- 
01   A0001
02   C2345
03   C2345
04   C2345
05   C2345

(所影响的行数为 5 行)
*/


--方法二:过程处理
--
重新准备数据
drop table test --一定要删除哦,因为上面的表有触发器哦
go

create table test(u_no char(2),u_nameid char(5))

insert into test select '01','A0001' union select
    
'02' ,              'B8921' union select 
    
'03'  ,             'C8762' union select
    
'04',               'D2345' union select
    
'05',               'E2345' union select
    
'06',               'F2345' union select
    
'07',               'G2345' union select
    
'08',               'H2345' union select
    
'09',               'I2345'
go


create proc proc_test
@u_no varchar(2),
@L    int
as
begin
    
declare @i char(2)
    
set @i = right('00'+ltrim(cast(@u_no as int+ @L - 1),2)
 
    
delete from test where u_no between @u_no and @i
    
update test
    
set u_no = right('00'+ltrim(cast(u_no as int- @L),2)
    
where u_no > @u_no
end 
go

--原始记录
select * from test
/*

u_no u_nameid 
---- -------- 
01   A0001
02   B8921
03   F8762
04   C2345
05   C2345
06   C2345
07   C2345
08   C2345
09   C2345

(所影响的行数为 9 行)
*/

--单条删除
exec proc_test '02',1
select * from test
go
/*

u_no u_nameid 
---- -------- 
01   A0001
02   F8762
03   C2345
04   C2345
05   C2345
06   C2345
07   C2345
08   C2345

(所影响的行数为 8 行)
*/


--批量删除开始
exec proc_test '02' ,2
select * from test
/*
u_no u_nameid 
---- -------- 
01   A0001
02   E2345
03   F2345
04   G2345
05   H2345
06   I2345

(所影响的行数为 6 行)
*/

--清除环境
drop table test
drop proc proc_test
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值