dBASEⅢ中的“物理”与“逻辑”
dBASEⅢ数据库中的各种操作是通过具体的命令来实现的。命令的通常格式是:〈命令动词〉[<参数序列>],命令的书写规则是要求命令的最大长度不得超过254字符(127个汉字)。而通常文本显示方式下,显示器屏幕上一行仅能显示80个字符,因此对于一条长度超过80个字符而又小于254个字符的命令来说,必须用若干行来表示这条命令。如: display next 4姓名,性别,职称,基本工资for year(date())-year(出生日期)〈=35.and.职称=“副教授”.and.性别=“男”这条命令,就至少要用两行来表示,因此这里就丰在着续行的问题。我们可在所显示的行末尾增写一个分号“;”以表明下一显示行是本行的继续。如上述命令在显示器屏幕上可表为display next 4 姓名,性别,职称,基本工资 for year (date());-year(出生日期)〈=35.and.职称=“副教授”.and.性别=“男”。我们把显示器屏幕上的一个自然行称为一个物理行,所以上述这条命令是用两个物理行来表示的。但下一个物理行是上一个物理行的续行,从逻辑上来说它们之间不是相互独立的,而是存在着内在的联系。因此这两个物理行构成了一个逻辑行,这个逻辑行完整地表示了上述这条命令。
2、物理删除和逻辑删除
在数据库操作中,我们利用delete命令为欲删除的记录加删除标记“*”,这种删除叫逻辑删除。逻辑删除并未真正从物理介质(如磁盘,内存等)中删除作了删除标记的记录,而仅是使这些记录暂时失效,以便让它们暂不参加某些操作。在set deleted on 状态下,作了删除标记的记录被暂时“隐蔽”起来,此时这些记录在数据库的所有操作中(个别情况除外)将不起作用。而在set delete off状态下,这时注删记录的“隐蔽”被削除,注侧记录恢复为有效记录(但仍为注删记录),在执行list count、sum等命令时,它们仍然起作用。我们不可通过recall命令撤消注删记录的标记“*”,使之恢复成常规记录。
数据库操作中的另一种删除是物理删除,我们用pack命令从当前数据库中将所有带删除标记的记录从磁盘上真正删除掉,用recall命令是无法将其恢复的。物理删除是在逻辑删除的基础上进行的,要进行物理删除的记录,首先必须对它进行逻辑删除。物理删除主要是使确属无用的记录从数据库中彻底清除掉,以空出被它们所占用的磁盘空间。
3、物理记录号和逻辑记录号
我们通常所说的数据库的记录号是指物理记录号,它反映了建库时数据记录输入的先后顺序。但这种排列顺序有时不能完全满足处理问题的需要,往往希望按一定的顺序显示或处理各记录。dBASEⅢ提供从物理上和逻辑上两个方面重新组织数据库存中记录顺序的手段。排序是从物理上对库存文件加以整理,索引则从逻辑上对加以整理。排序产生了一个新的库文件,它同当前数据库具有相同的库结构和库内容,但库内容中的各记录的顺序是按排序关键字段的排列顺序排列的,从而改变了原库中各记录的排列顺序。逻辑记录号反映了排序(或索引)关键字段值的大小顺序,在排序数据序中,其物理记录号和逻辑记录号是一致的。我们用index命令建立索引时当前库的物理记录号不变,也不生成一个新的库文件,仅是生成一个索引文件。索引文件不能单独使用,它是数据库的附属文件,是一个索引机构,只包含关键字表达式和记录号。因此在索引文件中,其逻辑记录号与物理记录号往往是不一致的。对于未使用索引的数据库,执行命令时若涉及到记录指针的移动,指针将按照物理记录号顺序进行移动。在使用索引的情况下,记录指针按主索引,在建立时的关键字表达式长值的顺序移动。此时逻辑首记录号通常不是物理记录号1,逻辑尾记录号也不一定等于总记录数。因此在使用移动记录指针命令go〈数值表达式〉时要注意,系统仍按物理记录号定位操作,而不是按逻辑记录号定位操作。但go top、go bottom均是使记录指针定位于物理(或逻辑)首记录,以及物理(或逻辑)尾记录。对于记录指针的相对移动命令skip〈数值表达式〉而言,记录指针都将以当前记录号为准,按物理顺序或逻辑顺序作相对移动。