注册 登录
编程论坛 ASP技术论坛

[原创]ACCESS"自动编号"类型重新编号的解决方法

hxfly 发布于 2005-11-03 14:14, 5845 次点击

只有本站会员才能查看附件,请 登录




写了一个小程序来解决"自动编号"类型因删除数据所造成的"断点"
程序主要是把"自动编号"重新排列

抛砖引玉
只给出思想及演示,没有做代码优化,希望大家相互交流



以下是代码
相关程序在上面的下载里面有,可以下载后自己测试


<%
'此程序由hxfly制作,版权为www.bc-cn.net和hxfly所有,请保留版权信息
'程序提供ACCESS“自动编号”类型重编号的思想,请根据自己的需要对变量进行更改
'程序提供演示,一旦执行,数据库内部数据将重新排列,如需查看效果,请在运行程序前把数据库另存
'相互交流,互相提高,如有ASP相关问题,欢迎到https://bbs.bc-cn.net(编程中国)论坛提问

strconn="driver={microsoft access driver (*.mdb)};uid=admin;pwd=china;dbq="&server.mappath("data/hxfly.mdb")
'建立数据库连接,数据库密码是china
set conn=server.createobject("adodb.connection")
conn.open strconn

i=1
'定义重排列的索引
sql="select * from test order by id asc"
set rs=conn.execute(sql)
do while not rs.eof

if(rs("id")=i) then
'如果数据的id与i相同,没有从编号的必要
Response.Write("数据"&rs("id")&"没有被更新的必要<p>")
i=i+1
'i自加
rs.movenext
'移动到下一条记录

else
'如果所选择的数据的id与i不相等
id=rs("id")
a=rs("a")
b=rs("b")
c=rs("c")
d=rs("d")
e=rs("e")
f=rs("f")
g=rs("g")
'对这条数据内的数据进行复制,这里根据自己的需要把原来字段的数据保存

sql2="insert into test (id,a,b,c,d,e,f,g) values("&i&",'"&a&"','"&b&"','"&c&"','"&d&"','"&e&"','"&f&"','"&g&"')"
'这里根据自己的需要把字段的数据更新
conn.execute(sql2)
'插入新数据,用i的值代替原来的id值
sql1="delete from test where id="&id
conn.execute(sql1)
Response.Write("数据"&id&"被更新为第"&i&"条,原第"&id&"条数据被删除<p>")
'并把原来的行清除
i=i+1
'i自加
rs.movenext
'循环到下一行
end if
loop
'结束循环

'验证效果可以从数据库的字段a来判断,原数据库的字段a值与id值相同,更新后的不同
'使用的时候把演示字段用的a,b,c,d,e,f,g全部换成自己数据库对应的字段(如更换不全,会造成数据丢失或者运行失败)
'程序提供解决这类问题的思路,如为此给您的数据带来任何损失,作者不负任何责任。使用前请先备份您的数据库!
%>


25 回复
#2
盖茨他爹2005-11-03 14:15
支持
#3
hxfly2005-11-03 14:27
ACCESS的自动编号类型是不能强行更新的
但是在插入数据的时候却可以赋值

主要根据这个来做的程序
思路是先根据连续变量i判断哪些些需要更新
哪些不需要更新

需要更新的行先把它的数据复制出来
然后插入数据的时候用一个连续变量 i来做它的ID
继续循环

这样到最后原来的id全部变成连续的i了
#4
suyongtao2005-11-03 14:33

我以前也想弄这一个这个东东.因为access自动编号类型数据事太多,又不得不用..
现在有了这个东东..就方便多了..
版主就是厉害,,

#5
840566862005-11-03 14:49
厉害

#6
islet2005-11-03 15:55
我一般都是把编号字段删除 再建一个自动编号字段 这样就重新编号了
#7
hxfly2005-11-03 16:17
#8
caiyakang2005-11-03 18:39
我怎么下不了啊
#9
caiyakang2005-11-03 18:40

上面的功能是不是,插入到以前如果ID被删了的空位

#10
风雨中2005-11-03 21:10
老大不愧为老大,这个东西特有用.
#11
rainic2005-11-03 21:15
能不能直接update id的值??

就是rs(id)=i 这样行不?
#12
盖茨他爹2005-11-03 22:12
好象自动编号得不能用UPDATE
#13
yms1232005-11-03 22:36
因此我在Access中,不愿意使用自动编号做主键。一般都使用数字类型做主键。不过楼主的思路到是可以学习一下,以后用在对数据库编号排序上管用。
#14
dreame2005-11-03 22:53
#15
hxfly2005-11-04 08:39
以下是引用caiyakang在2005-11-3 18:40:41的发言:

上面的功能是不是,插入到以前如果ID被删了的空位


同时删除被复制的那条记录

#16
水露2005-11-04 14:52
#17
piaoxue2005-11-04 15:07
我下载下来了,是压缩文件,但是解压需要密码,请问hxfly,密码是多少呀?
#18
caiyakang2005-11-04 15:30
这样用不知道可不可以实现同样的功能
插入的时候,后面加上:
where (id is null)
#19
hxfly2005-11-04 15:48
以下是引用piaoxue在2005-11-4 15:07:10的发言:
我下载下来了,是压缩文件,但是解压需要密码,请问hxfly,密码是多少呀?

密码不是在上面显示吗?
bbs.bc-cn.net

#20
jayend2005-12-12 09:07
太好了,谢谢楼主了,我刚好在找这样的程序呢,呵呵
#21
Smiling2005-12-21 15:57
楼主,请问解压密码是什么啊?

#22
google2005-12-21 15:59

密码不是在上面显示吗?
bbs.bc-cn.net

#23
Smiling2005-12-21 16:06

我知道了

#24
dlack2012-03-17 15:35
密码是多少?解压需要密码啊!
#25
elongtown2013-02-20 23:27
好东西,留个标签
#26
辰律2020-05-14 10:32
回复 10楼 风雨中
1