请教高手,ASP实现插入数据库记录自动编号中遇到的问题,O(∩_∩)O谢谢

xiuyer 2009-05-24 02:39:42
请教高手,小女不甚感激!
问题是这样的,我在用ASP+sqlserver做一个新闻发布网,添加新闻到数据库的时候编程实现的自动编号,iNewsID为新闻编号,类型的int,之后遇到了一个问题,就是当我删除了一则新闻后,比如此时我有10则新闻,删除了第4则,那么数据库里的编号自然就是1、2、3、5、6、7、8、9、10,再插入的时候编号自然就是11,我想实现在删除一则新闻的时候让其后面的新闻编号连续,比如刚刚说的这个,删了第4则之后,数据库里的编号是1、2、3、4、5、6、7、8、9,该如何实现呢?如果是在代码中每删除一则就更新数据库,让其后面的新闻的编号减1,但是我在删除一个栏目的时候,会批量的删除栏目下的所有新闻,就没法实现了,况且这种方法当数据库的新闻很多的时候,操作的过程就太费时了。费时也还可以暂时不考虑,关键是还没有实现呢,呵呵
不知有没有高手知道怎么做,给我说说,指教指教,不甚感激了。。。
...全文
513 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiuyer 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 newdigitime 的回复:]
楼主我告诉你,自动编号字段是不能改变的,删除后的记录,其自动编号仍然保留.
如果你想删除一条或多条记录后,让所有记录的编号重新更新(保持连续),就不能用"自动编号"字段.

你的想法是可以实现的,正如你所说,非常耗时.
假设你有2000条记录,现在删除了第180-188条记录,那么就从179条记录开始检测,定义一个变量tmpid,将第179条记录的编号存入tmpid=179,然后再跳到movenext下一条记录(即第189条记录),将第189条记录的编号更改…
[/Quote]
谢谢,仔细算来,编号连不连续好像关系也不大了,所以如此耗时的去做也不值得,O(∩_∩)O~,ok,这就结贴去。。。
xiuyer 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 cngothic 的回复:]
如果INT类型的取值范围不够用。当时设计者为什么会设定那么小。对于表来说20亿+这个数目已经是天文了。有哪些项目能用到那么多。
一天添加10000条 已经很大了吧。如果5人只是人肉操作。一天得累死也难添加不完吧。
一年添加 10000 * 365 = 3650000
50年添加 3650000 * 50 = 182500000

1 8 2 5 0 0 0 0 0

亿 千万 百万 十万 万 千 百 十 个

2的31次方是20亿+
[/Quote]
O(∩_∩)O~,对哦,是这样的,我自己没有好好算过,只是一下想起删了之后编号不连续,谢谢你!呵呵,看来我糊涂的有点严重了O(∩_∩)O~
newdigitime 2009-05-24
  • 打赏
  • 举报
回复
楼主我告诉你,自动编号字段是不能改变的,删除后的记录,其自动编号仍然保留.
如果你想删除一条或多条记录后,让所有记录的编号重新更新(保持连续),就不能用"自动编号"字段.

你的想法是可以实现的,正如你所说,非常耗时.
假设你有2000条记录,现在删除了第180-188条记录,那么就从179条记录开始检测,定义一个变量tmpid,将第179条记录的编号存入tmpid=179,然后再跳到movenext下一条记录(即第189条记录),将第189条记录的编号更改为tmpid+1即=180,再movenext到第190条记录,设置其编号为tmpid+1即181,直到结束.
cngothic 2009-05-24
  • 打赏
  • 举报
回复
如果INT类型的取值范围不够用。当时设计者为什么会设定那么小。对于表来说20亿+这个数目已经是天文了。有哪些项目能用到那么多。
一天添加10000条 已经很大了吧。如果5人只是人肉操作。一天得累死也难添加不完吧。
一年添加 10000 * 365 = 3650000
50年添加 3650000 * 50 = 182500000

1 8 2 5 0 0 0 0 0

亿 千万 百万 十万 万 千 百 十 个

2的31次方是20亿+
cngothic 2009-05-24
  • 打赏
  • 举报
回复
如果INT类型的取值范围不够用。当时为什么会设定那么小。对于表来说20亿+这个数目已经是天文了。有哪些项目能用到那么多。
一天添加10000条 已经很大了吧。如果5人只是人肉操作。一天得累死也难添加不完吧。
一年添加 10000 * 365 = 3650000
50年添加 3650000 * 50 = 182500000

1 8 2 5 0 0 0 0 0

亿 千万 百万 十万 万 千 百 十 个

2的31次方是20亿+
cngothic 2009-05-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiuyer 的回复:]
引用 8 楼 guchuanyisou 的回复:
为什么要这样啊,数据库还要管他呢,页面显示是按照顺序显示就行了啊

哦,主要就是要看数据库呀,如果不管,那么编号只会增加,这样这个系统用上一年、两年的,编号不就大的插不进数据库了吗?主要是我做的这个是要给别人用的,所以要考虑到这个,呵呵,谢谢你哦,你看看可以做吗?
[/Quote]


知道INT的数据类型的聚会范围吗?你添加删除10年能搞定20亿+的数据吗?
如果真到那个时候。新建个表。把超出INT限制的的表中的记录导入新表。ID又是新的。
要吗换个数据类型。设定个NVARCHAR(MAX)这个更爽哈哈
xiuyer 2009-05-24
  • 打赏
  • 举报
回复
该怎样去实现呢???O(∩_∩)O~谢谢
xiuyer 2009-05-24
  • 打赏
  • 举报
回复
谢谢ww85910,我的数据库中有很多张类似的表都需要这样的操作,我对sql懂的比较少,可不可以创建带参数的存储过程,就是在asp的代码中来给它传参,传表名和编号名?
Wayne 2009-05-24
  • 打赏
  • 举报
回复
以下是用游标实现的:

create procedure updateAll
as
begin

declare @id int,@iNewsID int,@count int
select @count=count(iNewsID) from tableName
set @id=1
select top 1 @id=iNewsID from tableName order by iNewsID
if @id <> 1
begin
update tableName set iNewsID=1 where iNewsID=@id
end
set @id=0
declare id_cursor cursor for
select iNewsID from tableName order by iNewsID
open id_cursor
fetch next from id_cursor into @iNewsID
while @@fetch_status = 0
begin
set @id=@id+1;
print @id;
update tableName set iNewsID=@id where iNewsID=@iNewsID
fetch next from id_cursor into @iNewsID
end
close id_cursor
deallocate id_cursor

Wayne 2009-05-24
  • 打赏
  • 举报
回复
不好意思,我用的是SQL2005
以下是我的一个思路(没测试),做一个存储过程,循环更新。。

create procedure updateAll
as
begin
declare @id int,@count int
select @count=count(iNewsID) from tableName --去的所有记录条数
set @id=1
select top 1 @id=iNewsID from tableName order by iNewsID
--如果第一条记录id不是1,就更新成1
if @id <> 1
begin
update tableName set iNewsID=1 where iNewsID=@id
end
set @id=0

while @id<@count
begin
set @id=@id+1;--累加@id,每次取下一条记录来做更新
update tableName a
set iNewsID=@id
from (select top 1 iNewsID from tableName where iNewsID>(@id-1)) b
where a.iNewsID=b.iNewsID
end

end
xiuyer 2009-05-24
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 guchuanyisou 的回复:]
select (select count(*) from users e2 where e1.userid >= e2.userid)xule, e1.pass from users e1 order by 1
给你解释解释O(∩_∩)O哈!
(select count(*) from users e2 where e1.userid >= e2.userid)xule 见一个虚拟的列名(名称可随便改)

select (select count(*) from users e2 where e1.userid >= e2.userid)xule, e1.pass from users e1 这是一个表 起得名字是e1

select count(*) from users e2 这是一…
[/Quote]
这个进行的是把编号选出来排个序,但真正的数据并没有更新哦。。O(∩_∩)O~
谢谢你了哦,给我回了那么多,给我提示了不少,我自己琢磨琢磨,估计要出来了。。呵呵呵
fanyanling 2009-05-24
  • 打赏
  • 举报
回复
select (select count(*) from users e2 where e1.userid >= e2.userid)xule, e1.pass from users e1 order by 1
给你解释解释O(∩_∩)O哈!
(select count(*) from users e2 where e1.userid >= e2.userid)xule 见一个虚拟的列名(名称可随便改)

select (select count(*) from users e2 where e1.userid >= e2.userid)xule, e1.pass from users e1 这是一个表 起得名字是e1

select count(*) from users e2 这是一个表 起得名字是e2

就是这样子啦
andy20022 2009-05-24
  • 打赏
  • 举报
回复
没用过asp
xiuyer 2009-05-24
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 bbqbin 的回复:]
顶了,这么好,有这么多人回答啊,我提问的半年都没有解决啊
不知是什么回事啊
[/Quote]
呵呵,有时候就是这样的,我有个问题也是,连个说闲话的人都没有哦,分都送不出去。。。O(∩_∩)O~
xiuyer 2009-05-24
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 guchuanyisou 的回复:]
2000中可以啦
select (select count(*) from users e2 where e1.userid >= e2.userid)xule, e1.pass from users e1order by 1
[/Quote]
O(∩_∩)O哈哈~,谢谢谢谢,可否解释一下,比如什么e1,e2的。。
反正ROW_NUMBER()用不了,这个函数从05才有的哦。。
fanyanling 2009-05-24
  • 打赏
  • 举报
回复
2000中可以啦
select (select count(*) from users e2 where e1.userid >= e2.userid)xule, e1.pass from users e1order by 1
bbqbin 2009-05-24
  • 打赏
  • 举报
回复
顶了,这么好,有这么多人回答啊,我提问的半年都没有解决啊
不知是什么回事啊
fanyanling 2009-05-24
  • 打赏
  • 举报
回复
是2000 没有该函数
xiuyer 2009-05-24
  • 打赏
  • 举报
回复
ROW_NUMBER()是内置函数,2000里不会没有吧??我希望有哦。。。
xiuyer 2009-05-24
  • 打赏
  • 举报
回复
该怎么解决呢?请教。。。等着呀。。。up..
加载更多回复(22)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧