记录插入问题: 对数据库的逻辑记录顺序中如何"插入"一条记录?!

BCB 2001-06-26 09:07:57
物理记录中是很难实现记录插入功能的,只有借助于索引了,
但下面这个情况常常遇到:
顺序是我录入的先后顺序(台帐中的先后顺序),在我录入的过程中,
可能录丢了某条记录,当然要设法补到原记录位置,,这就是"插入"功能,
象这种情况,大家怎么去处理?

肯定要借助于索引了,可偏偏又没有合适的关键字对应于录入的先后顺序.
有无高招?!

...全文
866 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyu 2001-06-28
  • 打赏
  • 举报
回复
在数据库设计的时间,增加个时间字段,如datetimestamp
以此为索引,就可以插入了。插入时构造个时间,就行了
不是很简单的//hehe
jack_twb 2001-06-28
  • 打赏
  • 举报
回复
你说的顺序已经有商业含义了,应该用程序保证,即在表中加一个字段,
并且用程序来维护。最好不要用数据库来实现。
BCB 2001-06-28
  • 打赏
  • 举报
回复
to xiaoyu(): 
插多了,就没有中间"时间"可插了,你同样会遇到极端情况;
我说哑了,也没人听得进去.
lanchat 2001-06-28
  • 打赏
  • 举报
回复
用链表可以解决
lanchat 2001-06-28
  • 打赏
  • 举报
回复
谁能告诉我win98下的vtoolsd开发工具包到哪里下载?email: mylanchat@163.com
BCB 2001-06-27
  • 打赏
  • 举报
回复
并没有复杂的算法: 上、下记录编号相加/2为新插入的顺序编号,
稍复杂的部分就是处理极端情况(不能不考虑呀)
给分了!

BCB 2001-06-27
  • 打赏
  • 举报
回复
!
BCB 2001-06-26
  • 打赏
  • 举报
回复
求平均值的办法,所以在同一处插入约 log2(Step)次,就要面临小调整,
若取step=100,同一处6次左右就要调整了,step取1000,10次
根据需要了
孩皮妞野 2001-06-26
  • 打赏
  • 举报
回复
>>BCB

可以, 与这个方法实出一辙:

SeqNo SubNo Name
1 0 V
2 0 M
3 0 J
4 0 K
5 0 L
6 0 N


步长的选择比较关键, 我觉得对一般的应用而言, 100 足够, 当然, 越大需要调整的可能九越小, 1000也不错, 绝对可以解决你的问题了。(建议100)。
BCB 2001-06-26
  • 打赏
  • 举报
回复
我的想法是,就是用整数做顺序编号,编号之间间隔较大,比如取step=1000,
每当插入一条时,取上下两条号的平均值做为新的顺序号,
坏的情况(间隔已为1):
从要插的位置往下找有间隙的顺序号,找到后,求新的平均间隔,
倒着往上调整顺序号,就可插入;
最极端坏的情况,到末尾间隔都为1就是大调整了, 间隔号改为step,
大家分析一下,怎样?!












孩皮妞野 2001-06-26
  • 打赏
  • 举报
回复

顺序号不需要连续, 尽管删除, 不需要整理。

因为取数时是:

select * from mytable order by seqno, subno;

不联号根本不是问题。
BCB 2001-06-26
  • 打赏
  • 举报
回复
to songhtao(三十年孤独):
大型的用于数据查询的数据库的确顺序不重要,
但我偏偏要有录入顺序,企业里的报表全都有顺序,没有顺序就是不行
「已注销」 2001-06-26
  • 打赏
  • 举报
回复
顺序号需要整理的

如果将来删除

所以我建议尽量避免使用这个东西

@_@
wjzhuang 2001-06-26
  • 打赏
  • 举报
回复

时间取当天时间(需要的话好可以取到小时)
当前日期+顺序号
如:
20010626+100
20010626+101
20010627+100
20010627+101

孤独兄说的货物编号据我所知就是以当前的日期加上一个顺序号来生成的

孩皮妞野 2001-06-26
  • 打赏
  • 举报
回复
BCB,
比你想象的要快, 而且这个工作在后端作, 速度飞快。 你可以用一个大表作测试, 比你想象得要快。

如果你还是觉得不妥, 那就用这样吧
SeqNo SubNo Name
1 0 V
2 0 M
3 0 J
4 0 K
5 0 L
6 0 N

插入时把 SubIndex 加1, 比如要插在J前
SeqNo SubNo Name
1 0 V
2 0 M
2 1 x
3 0 J
4 0 K
5 0 L
6 0 N

可以满足你的要求吗? 等subindex满了(==max(unsigned))在调整SeqNo.



我不懂电脑 2001-06-26
  • 打赏
  • 举报
回复
据我所知通常录入顺序是没有意义的,如果是货物通常都有货物编号,编号作关键码。如果是记账则可以通过时间查找。
BCB 2001-06-26
  • 打赏
  • 举报
回复
to ALNG(至饶远势波千倾,渐满清辉月上弦):
" 先把>=1001的序号往后挪一位,
update MyTable set SeqNo =SeqNo+1 where SeqNo >=1001; "
记录不太多时较简单,
但记录较多时,从算法上来讲效率不高,
每当在最上端插入一条,所以记录的顺序号都要集体加1(株联太多);

to wjzhuang:
时间说穿了也是数字,插多了,也会相同的,
新插入的记录的'时间'怎么定呢?! 时间不定性更厉害
BCB 2001-06-26
  • 打赏
  • 举报
回复
to ALNG(至饶远势波千倾,渐满清辉月上弦):
" 先把>=1001的序号往后挪一位,
update MyTable set SeqNo =SeqNo+1 where SeqNo >=1001; "
记录不太多时较简单,
但记录较多时,从算法上来讲效率不高,
每当在最上端插入一条,所以记录的顺序号都要集体加1(株联太多);

to wjzhuang:
时间说穿了也是数字,插多了,也会相同的,
新插入的记录的'时间'怎么定呢?! 时间不定性更厉害
BCB 2001-06-26
  • 打赏
  • 举报
回复
to ALNG(至饶远势波千倾,渐满清辉月上弦):
" 先把>=1001的序号往后挪一位,
update MyTable set SeqNo =SeqNo+1 where SeqNo >=1001; "
记录不太多时较简单,
但记录较多时,从算法上来讲效率不高,
每当在最上端插入一条,所以记录的顺序号都要集体加1(株联太多);

to wjzhuang:
时间说穿了也是数字,插多了,也会相同的,
新插入的记录的'时间'怎么定呢?! 时间不定性更厉害
孩皮妞野 2001-06-26
  • 打赏
  • 举报
回复
确实, 这种无聊的行为应该受到抵制和谴责!
加载更多回复(30)

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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