jockey说得有道理, http://www.cnblogs.com/zhenyulu/articles/28418.html这里谈到一点此问题
三、逻辑删除与物理删除
逻辑删除是VFP的特色,很多人对此也有看法。逻辑删除乍一看就象回收站,误删除的记录还可以还原回来,确认不需要的再清空。可也有很多VFP编程人员养成了一个习惯,就是DELETE后立即PACK,凭什么删除还犹豫呢?可他们很快就发现,PACK命令似乎总和他们作对,有时一PACK,窗口上的网格控件只剩下白板一块,什么都没有了,有时执行PACK会报错,说“必须以独占方式打开表”,反正总是不顺。为什么会这样呢?
话又转到“记录号”上来了。假设我们要删除年龄为22的记录,因为VFP将记录号做“主键”来用,若VFP直接执行物理删除的话,那么当第三条记录从磁盘上清理掉后,原来记录号为 4 的记录就变成了记录号为 3 的记录(物理顺序变了),在这个时候,如果另外一个用户更新了原有记录号为 3 的记录并进行提交,就会误修改原来记录号为 4 (现在记录号为 3)的记录。VFP为了防止这种共享冲突,添加了两个限制:一是先逻辑删除再物理删除,二是物理删除时必须以独占方式打开表。这样的话,用户执行逻辑删除仅仅是在记录上加一个删除标识,不会从磁盘文件中真正删除,也就不会改变记录号,所以可以避免并发冲突。当用户想真正物理删除数据时,必须以独占方式打开表,以确保没有其他人正在使用数据库,便不会产生共享问题了。
此外,VFP为了让用户感觉不到逻辑删除记录的存在,保留了SET DELETE ON、SET DELETE OFF设置,力争将逻辑删除带来的影响减少到最小。但怎么可能呢?有谁会注意到在SET DELETE OFF时使用“SELECT * FROM STUDENT”命令需要加上条件“WHERE NOT DELETED()”以排除逻辑删除的记录呢?甚至通过“SELECT COUNT(*) FROM STUDENT”统计学生人数时,DELETE状态也会影响检索结果!
由此可见很多麻烦都是“记录号”惹的祸,也可以看出VFP在这里的良苦用心。