程序员家园论坛软件开发数据库技术讨论区 标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

1  /  1  页   1 跳转 查看:3816

标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

/*
        测试环境:windows 2K server + Mssql 2000
        所有功能都进行测试过,并有相应的结果集,如果有什么疑义在论坛跟帖
        关于版权的说明:部分资料来自互联网,如有不当请联系版主,版主会在第一时间处理。
        功能:自已做标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况,但是对一个数据量大的表,参照者得注意速度哟。
*/


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

--创建表
create table test_tb(id int default dbo.f_getmaxid(),[name] varchar(10))
go

--创建触发器,在删除表中的记录时,自动更新记录的id
create trigger tr_delete on test_tb
AFTER delete
as
        declare @id int,@mid int
        select @mid=min(id),@id=@mid-1
                from deleted
        update test_tb
                set id=@id,@id=@id+1
                where id>@mid
go

--插入记录测试
insert into test_tb(name) values('张三')
insert into test_tb(name) values('张四')
insert into test_tb(name) values('张五')
insert into test_tb(name) values('张六')
insert into test_tb(name) values('张七')
insert into test_tb(name) values('张八')
insert into test_tb(name) values('张九')
insert into test_tb(name) values('张十')

--显示插入的结果
select * from test_tb
/*
id          name     
----------- ----------
1          张三
2          张四
3          张五
4          张六
5          张七
6          张八
7          张九
8          张十

(所影响的行数为 8 行)
*/
--删除部分记录
delete from test_tb where name in('张四','张三','张八','张十')

--显示删除后的结果
select * from test_tb
/*
id          name     
----------- ----------
1          张五
2          张六
3          张七
4          张九

(所影响的行数为 4 行)
*/
--清理环境
drop table test_tb
drop function f_getmaxid
心若无尘,一花一世界,一鸟一天堂
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

如果这样的话,前台每删除一次数据就必须刷新一次,否则更新的时候就会出错。
宠辱不惊,看庭前花开花落,去留无意,望天空云卷云舒
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

是的,目的是学习解决问题的一种方法,实际得因情况不同采用不同的方法,当时这个话题是在单机版上的做的
心若无尘,一花一世界,一鸟一天堂
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

哦,如果单机版上的数据同时又删除的和更新的,也会出错的。
宠辱不惊,看庭前花开花落,去留无意,望天空云卷云舒
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

愿听其详,自己写程序是可控的
心若无尘,一花一世界,一鸟一天堂
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

比如说,用户删除了第一行数据,然后编辑了第二行数据,这是后更新到数据库中,如果数据库先执行delete的话,因为有触发器的原因,原来第二条数据的主键将被更新,这是数据库更新第二条数据会提示在更新前数据已经发生变化。因为这里delete和update是在一个事务里面的,总不能删除后在刷新数据吧?否则永不编辑的就丢失了
宠辱不惊,看庭前花开花落,去留无意,望天空云卷云舒
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

这个不连续就不连续呗,就为了要想ID连续,性能损失太大
再说了,很多时候数据跟其他表是有关联的
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

恩,支持一下老同学
暂时没有想好
 

回复:标识列的例子,解决了本身数据库自增列在删除后ID不连贯的情况

支持一下
 
1  /  1  页   1 跳转

版权所有 程序员家园论坛   Sitemap

Powered by Discuz!NT 2.1.202    Copyright © 2001-2008 Comsenz Inc.
Processed in 0.046875 second(s) , 4 queries. 浙ICP备07502118号
返顶部