实表的维护

阅读(241) 标签: 实表, 维护, update, delete,

组表中的实表,和普通的序表类似,其中的记录是可以增删或修改的。我们通过下面的例子来了解如何修改实表中的记录:

 

A

B

1

=file("D:/file/dw/employees.ctx")

 

2

=A1.create()

=A2.attach(stable)

3

=A2.cursor(;EID==3).fetch()

=B2.cursor(EID,OCount,OAmount;EID<20).fetch()

4

=A3.derive()

=B3.derive()

5

>A4.run(EID=0)

>B4.run(OCount=0)

6

=A2.update@n(A4)

>B2.update(B4)

7

=A2.cursor().fetch()

=B2.cursor(;EID<20).fetch()

在这里,打开11.1.组表的生成 中使用的组表employees.ctxA2B2中分别打开基表和附表stableA4中取出编号为3的员工记录如下:

为了保留原始值以作对比,在A4中,将A3中数据复制,并在A5中改变了EIDA4中数据如下:

A6中调用T.update(P) 函数,更新实表T,在这里添加了@n选项,能够返回有变化的记录,返回的就是A4中改变的记录。在A7中,重新从组表基表中取出数据如下:

执行T.update(P) 函数时,将会比较PT的键值,更新对应的记录。可以发现,在改变了键值EID的情况下,原记录并没有被删除,而是具有新键值的记录被添加到实表中,新记录被添加到实表中时,主键仍然会保持有序。如果需要在更新时只处理更新,则可以添加@u选项,此时新的键值将被忽略。类似的,也可以添加@i选项,仅处理需要添加的记录。

再来看批量修改数据的情况,B4中取出EID小于20的所有销售员记录,注意为了保证更新时的结构统一,这里必须仅获取销售员实表stable本身的字段,结果如下:

B5中将这些数据复制,并在B6中修改OCount字段的值,修改后结果如下:

B7中,用B5中修改过的数据来更新实表stable。更新后,在B8中,重新在实表中取出EID小于20的销售人员记录,结果如下:

可以看到,实表中对应的数据被修改了。

 

如果需要删除记录,可以使用T.delete(P) 函数,如:

 

A

B

1

=file("D:/file/dw/employees.ctx")

 

2

=A1.create()

=A2.attach(stable)

3

=A2.cursor().fetch()

=B2.cursor().fetch()

4

=A3.select(EID<1)

=B3.select(EID<20)

5

>A2.delete(A4)

=B2.delete@n(B4)

6

=A2.cursor().fetch()

=B2.cursor().fetch()

7

 

>B2.update(B4)

A5中选出将要删除的记录:

A6中删除记录后,A7中读出实表中的数据如下:

B5中选出了附表stableEID小于20的记录,准备将它们全部删除:

B6中调用delete时,添加了@n选项,此时将返回被删除的记录,B6中的结果和B5中是相同的。删除执行后,在B7中重新从实表etable中取出数据如下:

和前面例子的结果对比,可以发现B5EID小于20的记录都被删除了。

最后,在B8中,将stable中被删除的数据重新添加到实表中,以免影响数据的使用。

执行update或者delete时,如果实表有索引,将会自动更新。

组表读取完成后,可以用T.index()函数关闭。

 

在生成组表时,可以指定组表的读/写密码,在访问组表时也需要输入密码才有相应权限访问。如:

 

A

B

1

=create(Num,Accu)

0

2

>100.run(A1.insert(0,#,B1=B1+#))

 

3

=file("D:/file/dw/numbers.ctx")

=A3.create(#Num,Accu;;"wpwd":"rpwd")

4

 

>B3.append(A1.cursor())

5

=A3.create(;;"wpwd")

=A5.cursor().fetch()

6

=create(Num,Accu).record([101,5151,102,5253])

 

7

>A5.append(A6.cursor())

=A5.cursor().fetch()

前两行生成一个简单的数据表,包含正整数列以及累积和,执行后A1中得到数据如下:

B3中生成组表时,用f.create(C1,C2,…;K;pw:pr) 函数指定了组表的读写密码,其中读文件密码为"rpwd",写文件密码为"wpwd",并在B4中将A1中的数据写入组表的基表。在A5中打开组表时,需要用f.create(;;p) 函数输入密码p来获得相应的权限。A5中输入了写密码,组表可以读也可以被改写。B5中从组表基表中获得的数据和A1相同,如下:

A6中再生成两条后续记录的数据如下:

A7中将上面的数据添加到组表的基表中,B7中获得结果如下:

如果A5中打开组表时,使用的是读密码rpwd,则只拥有只读权限,如果仍然在A7中尝试添加数据,会提示错误,说明无可写权限:

组表的密码是无法修改的,如果想修改或者去除密码,只能重新生成,如:

 

A

B

1

=file("F:/file/dw/numbers.ctx")

 

2

=A1.create(;;"rpwd")

=A2.cursor().fetch()

3

=A1.create@y(#Num,Accu)

>A3.append(B2.cursor())

4

=A1.create()

=A4.cursor().fetch()

A2中用读密码打开加密后的组表,并在B2中读出其基表中的数据。在A3中重新生成不带密码的新组表,这里添加了@y选项来强制重新创建组表文件。如果没有@y选项,当同名的组表文件已经存在时是不允许重建的,会中断计算并弹出错误信息。

B3中将B2中的数据写入新组表的基表后,在A4中重新打开组表,此时已经不再需要密码了。B4中读取到的数据如下:

 

使用f.append(f', p) 函数,可以将一个无密码的组表文件f'中的数据,合并到加密组表文件f中,执行时需要写入f的可写密码p,注意两个组表文件的结构必须相同。如:

 

A

B

1

=file("F:/file/dw/numbersNew.ctx")

=A1.create@y(#Num,Accu;;"wpwd":"rpwd")

2

=create(Num,Accu).record([0,0])

>B1.append(A2.cursor())

3

=file("F:/file/dw/numbers.ctx")

>A1.append(A3,"wpwd")

4

=A1.create(;;"rpwd")

=A4.cursor().fetch()

1行生成加密组表文件numbersNew.ctx,和前面例子中重新生成的无密码组表文件numbers.ctx结构相同。A2中生成了一条记录并在B2中填入组表numbersNew.ctx

 

B3中,将组表文件numbersNew.ctx中的数据添加到numbersNew.ctx中。从B4中可以查看到,执行后数据添加到了原数据的后面:

 

执行f.append(f', p) 时,如果添加了选项@x,将会在数据添加后删除原组表文件f'