当然存在了。delete记录,其实只是在记录的前面写上一个特殊的符号,标识这条记录是作为被删除记录看待的,能不能看到,在乎显示数据的指令(亦即程序员)是否跳过它。这就是每条记录的真实尺寸比所有字段尺寸的总和大一个字节的原因。像Grid那样的控件,有一个DeleteMark屬性,就是控制这个字段(本质上这一列符号也是字段)是否呈现出来的,Browse指令就是一个Grid对象。set deleted on全局设置,是告诉所有相关的指令代码:当你处理数据之前,若发现这个全局变量为真,就跳过被标识为删除的记录不处理。仅此而已,物理上,这些数据是仍然存在的,所谓的recall恢复记录,不过就是把那个标志字符抹去而已。我曾说过回收记录,就是这么做的。
明白这个原理,所谓的删除或消隐、过滤、筛选,统统都是这个手法,关键处是控制循环的skip條件。不妨回忆一下,set filter to过滤数据之后,为什么要把记录指针移动一下才行呢?那是为了防止当前记录指针正好落在被标识删除的记录上,若不移动一下发生skip判断,那么引用当前记录数据的时候就会出现错误。
记录号是不变的,与生俱来的。有人依据记录号作为顺序,那是把逻辑顺序和物理顺序搞混了,前者可以按照索引條件变化,goto bottom的记录,未必是recno最大的。有个别的insert指令,会把记录物理插入在表的中间,它会搬动数据,从而把一批数据的记录号全变动过。append总是比insert快。在某些追求效率的程序环境中,为了不浪费磁盘空间,以及回避pack需要独占数据表的困难,可以使用上述的回收记录方式,这个时候,模拟的append不是追加在表尾的(记住:数据的顺序应该以索引为依据,改变索引字段正确的值即可,不要用记录号)。
记录号,本质上就如数组的下标,那是一个物理位置序号。空间位置是不会变的,永远存在的,但在这个空间上的数据是可以变的。房子住什么人,的确会变。
[
本帖最后由 TonyDeng 于 2015-5-29 16:28 编辑 ]