表﹕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 .....用什么實現呢﹖觸發器﹖還有其他的方法沒?
字段: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 FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)--插入资料
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN--显示结果
SELECT * FROM tb
/*--结果
BH col
---------------- -----------
BH000001 1
BH000002 2
BH000003 4
BH000004 14
--*/
--1,u_NO_Char不要设为标识列;
--2,表中新增两列:
Alter Table [tb] Add [ID] IDENTITY(1,1)
Alter Table [tb] Add Deleted bit Default 1
--3,当你删除时,不要真正的删除数据;
Update [tb] Set Deleted=0 where [id]=@ID
--4,以后当你需要新增时,查找最小可用的u_No_Char
select u_no_Char,* from tb where id=(select min(id) from tb where u_no_char=@u_no And Deleted=0)
--执行新增:
Insert Into [tb]...
再執行語句 update test set u_no = u_no -1 where u_no > N'" + 刪除列u_no + "'就完了﹐謝謝各位,分還是要給﹐晚點,畢竟學習了.
因為是刪除一次﹐保存一次﹐所以不會出現同時刪除>1條紀錄的情況我發現liangCK出現的特別快...
* 功能:中断ID的连续处理 *
* 适用:SQL Server 2000 / SQL Server 2005 *
* 返回:1相同0不相同 *
* 作者: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(1) from 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 --一定要删除哦,因为上面的表有触发器哦
gocreate 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
/* u_no 為key值時,上面諸位說的恐怕就不行了吧.
個人覺得思路應該是 ,刪掉u_no>= @no 的所有記錄
,然後在觸發器裡在處理將 u_no> @no 的紀錄,
再依次insert 到 test 裡.
*/
/* u_no 為key值時,上面諸位說的恐怕就不行了吧.
個人覺得思路應該是 ,刪掉u_no>= @no 的所有記錄
,然後在觸發器裡在處理將 u_no> @no 的紀錄,
再依次insert 到 test 裡.
*/