关于自动生成唯一性ID的问题

panyang19790212 2004-04-26 10:50:11
我正在用ado+access做一个关于图书的小系统。我想在新增图书的时候,调用insert方法后,自动生成新图书的唯一性代码?请问怎么实现???如果要是人工生成的化,太麻烦了,图书多了的话,用户也不知道哪个ID是可用的,哪个是已经用的了。
我试着用了ACCESS的自动编码类型的字段但实在是太烂了,而且在INSERT时,该字段对应的DBEdit是不可见的(而且不能编辑),最好不用自动编码类型的字段。而用文本型的(00000001~~99999999),求助一个较好的自动生成图书ID代码的方法(算法)。
...全文
277 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
mynameisking 2004-05-07
  • 打赏
  • 举报
回复
identity
panyang19790212 2004-05-07
  • 打赏
  • 举报
回复
可能我的办法有点笨了。呵呵~~~~~自动查找到不连续的那个ID的开始处,然后插入新的ID号。
panyang19790212 2004-05-07
  • 打赏
  • 举报
回复
呵呵~~各位我已经想出来个办法了,可能比较蠢,但挺灵的,请各位指教。

//ID为ACCESS中的长整形字段,代表图书的唯一性代码

procedure TForm1.Button1Click(Sender: TObject);
var
j,k: Integer;
begin
ADOTable1.Sort:='ID ASC';
ADOTable1.First;
j:=ADOTable1['ID'];
ADOTable1.Next;
k:=ADOTable1['ID'];

while (k-j=1) do
begin
j:=k;
ADOTable1.Next;
k:=ADOTable1['ID'];
end;

Edit1.Text:=Inttostr(j+1);
miky 2004-05-03
  • 打赏
  • 举报
回复
那你不能不用DBedit吗?怎么能怪到自增字段的头上呢?
其实什么DBedit,DBGrid之类的,会给你的开发带来很大的限制,想要方便,就必须放弃一定的自由度,有得必有失。
panyang19790212 2004-05-03
  • 打赏
  • 举报
回复
自增字段在用DBEdit开发时,如果你调用了ADOTable.Append;方法后,该DBEdit上Text内容是不可见的(不能让用户立即看见新生成的流水号)。只有保存后POST才能看见。我想让它马上显示出新增的ID。另外本人用是access+ado是个单机的系统,求教好的方法!!!
miky 2004-05-02
  • 打赏
  • 举报
回复
可以建一个表,作为流水帐号。每插入一条记录,先取流水帐号表的ID,在修改流水帐号表的ID,使它加一,这样取出来的ID号就不可能有重复的了
-----------------------------------------------------------对的
如果是并发的可以用存储过程来控制生成
过程实现的:计算最大id,更新表id=id+1,返回最大id+1给客户端程序
----

这不正是自增字段为我们做的吗?

我不明白自增字段有什么问题,我觉得非常好用。

只有一种情况,就是你有多个不连网的客户端,为了保证他们的数据ID也不重复,这时候才不能用。
miky 2004-05-02
  • 打赏
  • 举报
回复
hkbarton(→Beginner←) 的方法我以前也用,但不能保证唯一,如果用户修改了时间呢?如果是多用户呢?
lijinghe1 2004-05-02
  • 打赏
  • 举报
回复
可以建一个表,作为流水帐号。每插入一条记录,先取流水帐号表的ID,在修改流水帐号表的ID,使它加一,这样取出来的ID号就不可能有重复的了
-----------------------------------------------------------对的
如果是并发的可以用存储过程来控制生成
过程实现的:计算最大id,更新表id=id+1,返回最大id+1给客户端程序
----

完全同意
GUID太长了,自增字段问题多多。用时间既不安全,也有些长,影响效率。
panyang19790212 2004-05-02
  • 打赏
  • 举报
回复
miky(miky) 说的有道理。就没什么好的办法吗??继续关注。。。。。。
jinjazz 2004-04-27
  • 打赏
  • 举报
回复
可以建一个表,作为流水帐号。每插入一条记录,先取流水帐号表的ID,在修改流水帐号表的ID,使它加一,这样取出来的ID号就不可能有重复的了
-----------------------------------------------------------对的
如果是并发的可以用存储过程来控制生成
过程实现的:计算最大id,更新表id=id+1,返回最大id+1给客户端程序
zousoft 2004-04-27
  • 打赏
  • 举报
回复
还可以在数据库后端, 定义一个触发器, 通过生成器自动生成字段.
hlb1111 2004-04-27
  • 打赏
  • 举报
回复
可以建一个表,作为流水帐号。每插入一条记录,先取流水帐号表的ID,在修改流水帐号表的ID,使它加一,这样取出来的ID号就不可能有重复的了
sunzhiquan 2004-04-27
  • 打赏
  • 举报
回复
求最大记录号
hkbarton 2004-04-27
  • 打赏
  • 举报
回复
GUID 太长了,可以根据系统当前的年月日再加上时间就可以生成唯一的id了
kasm 2004-04-27
  • 打赏
  • 举报
回复
求表中最大记录号。
jinjazz 2004-04-27
  • 打赏
  • 举报
回复
没必要guid吧..
kaershaw 2004-04-27
  • 打赏
  • 举报
回复
自动编号或者用条形码
panyang19790212 2004-04-27
  • 打赏
  • 举报
回复
还有没有更好的方法???最好是生成的ID在00000000~~~99999999之间就更好了。
ma7ht 2004-04-27
  • 打赏
  • 举报
回复
formatdataTime('YYYYMMDDHHmmss',now)+inttostr(random('99999'));
qizhanfeng 2004-04-27
  • 打赏
  • 举报
回复
在程序里写自动编号的方法
加载更多回复(9)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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