自增列做不到. 可以在操作数据之前用个判断,把值放入变量.declare @i as int select @i = isnull(max(id),0) + 1 from tb
--自已做标识列的例子,不自动重排编号,而是自动补号:--创建得到最大id的函数 IF NOT OBJECT_ID('[f_getid]') IS NULL DROP function f_getid GO create function f_getid() returns int as begin declare @id int if not exists(select 1 from tb where id='001') set @id=1 else begin select @id=max(id) from tb if @id is null set @id=1 else begin declare @id1 int select @id1=min(id) from tb a where id<>@id and not exists(select 1 from tb where id=a.id+1) if @id1 is not null set @id=@id1 set @id=@id+1 end end lb_re: return @id end go--创建表 IF NOT OBJECT_ID('[tb]') IS NULL DROP TABLE tb GO create table tb(id int primary key default dbo.f_getid(),name varchar(10)) 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 /* id name ----------- ---------- 1 张三 2 张四 3 张五 4 张六 5 张七 6 张八 7 张九 8 张十(8 行受影响)*/ --删除部分记录 delete from tb where name in('张三','张七','张八','张十')--显示删除后的结果 select * from tb /* id name ----------- ---------- 2 张四 3 张五 4 张六 7 张九(4 行受影响)*/ --再次插入记录 insert into tb(name) values('李一') insert into tb(name) values('李二')--显示插入的结果 select * from tb order by id /* id name ----------- ---------- 1 李一 2 张四 3 张五 4 张六 5 李二 7 张九(6 行受影响) */--删除环境 drop table tb drop function f_getid本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/07/22/4369943.aspx
/*-------------------------*问题描述:表中采用了自增列删除记录会出现断号的情况,但是又想让它删除后自动重新编号?*采用函数+触发器的方法替代IDENTITY的功能,并且解决断号问题------------------------------------*/--创建实现自增列的函数create function f_getID()returns intasbeginreturn(select isnull(max(id),0)+1 from tb)endgo --创建表create table tb(id int primary key default dbo.f_getID() ,name varchar(20))go --创建触发器,在删除表中的记录时,自动更新记录的id,解决断号的烦恼create trigger t_s_duanhao on tbAFTER deleteasdeclare @mid intselect @mid=min(id)-1from deletedupdate tb set id=@mid,@mid=@mid+1where id>@mid+1go --插入记录测试(只能一条条记录插入)insert into tb(name) values('1哥')insert into tb(name) values('2哥')insert into tb(name) values('3哥')insert into tb(name) values('4哥')insert into tb(name) values('5哥')insert into tb(name) values('6哥')insert into tb(name) values('7哥')insert into tb(name) values('8哥') --显示插入的结果select * from tb --删除部分记录delete from tb where name in('1哥','4哥','7哥','8哥') --显示删除后的结果select * from tb /*--测试结果id name----------- --------------------1 2哥2 3哥3 5哥4 6哥--*/--删除环境drop table tbdrop function f_getID
DBCC CHECKIDENT (tt,RESEED,3)
可以在操作数据之前用个判断,把值放入变量.declare @i as int
select @i = isnull(max(id),0) + 1 from tb
IF NOT OBJECT_ID('[f_getid]') IS NULL
DROP function f_getid
GO
create function f_getid()
returns int
as
begin
declare @id int
if not exists(select 1 from tb where id='001')
set @id=1
else
begin
select @id=max(id) from tb
if @id is null
set @id=1
else
begin
declare @id1 int
select @id1=min(id) from tb a where id<>@id and not exists(select 1 from tb where id=a.id+1)
if @id1 is not null set @id=@id1
set @id=@id+1
end
end
lb_re:
return @id
end
go--创建表
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE tb
GO
create table tb(id int primary key default dbo.f_getid(),name varchar(10))
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
/*
id name
----------- ----------
1 张三
2 张四
3 张五
4 张六
5 张七
6 张八
7 张九
8 张十(8 行受影响)*/
--删除部分记录
delete from tb where name in('张三','张七','张八','张十')--显示删除后的结果
select * from tb
/*
id name
----------- ----------
2 张四
3 张五
4 张六
7 张九(4 行受影响)*/
--再次插入记录
insert into tb(name) values('李一')
insert into tb(name) values('李二')--显示插入的结果
select * from tb order by id
/*
id name
----------- ----------
1 李一
2 张四
3 张五
4 张六
5 李二
7 张九(6 行受影响)
*/--删除环境
drop table tb
drop function f_getid本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/07/22/4369943.aspx