组表中的实表,和普通的序表类似,其中的记录是可以增删或修改的。我们通过下面的例子来了解如何修改实表中的记录:
|
A |
B |
1 |
=file("D:/file/dw/employees.ctx") |
|
2 |
=A1.open() |
=A2.attach(stable) |
3 |
=A2.cursor(;EID==4).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(100) |
=B2.cursor(;EID<20).fetch() |
8 |
>A2.close() |
|
在这里,打开组表的生成 中使用的组表employees.ctx,A2和B2中分别打开基表和附表stable。A3中取出编号为4的员工记录如下:
为了保留原始值以作对比,在A4中,将A3中数据复制,并在A5中改变了EID,A4中数据如下:
在A6中调用T.update(P) 函数,更新实表T,在这里添加了@n选项,能够返回有变化的记录,返回的就是A4中改变的记录。在A7中,重新从组表基表中取出数据如下:
执行T.update(P) 函数时,将会比较P与T的键值,更新对应的记录。可以发现,在改变了键值EID的情况下,原记录并没有被删除,而是具有新键值的记录被添加到实表中,新记录被添加到实表中时,主键仍然会保持有序。如果需要在更新时只处理更新,则可以添加@u选项,此时新的键值将被忽略。类似的,也可以添加@i选项,仅处理需要添加的记录。实际上,在组表中,更新数据时,主键值是不允许改变的,否则就会出现前面例子中的情况,原记录被保留,只是增加了新的数据。
再来看批量修改数据的情况,B3中取出EID小于20的所有销售员记录,注意为了保证更新时的结构统一,这里必须仅获取销售员实表stable本身的字段,结果如下:
在B4中将这些数据复制,并在B5中修改OCount字段的值,修改后结果如下:
在B6中,用B5中修改过的数据来更新实表stable。更新后,在B7中,重新在实表中取出EID小于20的销售人员记录,结果如下:
可以看到,实表中对应的数据被修改了。
执行update或者delete时,如果实表有索引且维护时涉及索引相关的记录,则索引将会自动更新。
组表中的记录,是按主键值有序的,因此不能随意删除,组表读取完成后,可以用T.close()函数关闭。
与组表不同,复组表如果需要删除记录,可以使用更新标识字段。更新标识字段是键字段之后的一个字段,它用来表示组表执行更新时需要执行的操作,null表示新记录,需要增加,true表示需要删除的记录,false表示需要修改的记录。有了更新标识字段,在复组表读取数据时,就可以考虑更新标记后整理读取了,下面用一个例子来了解:
|
A |
B |
1 |
=file("d:/file/dw/employeesMark.ctx":[1]) |
=A1.create@yd(#EID,Mark,Dept,Gender,Name;1) |
2 |
=file("d:/file/dw/employees.ctx") |
=A2.open().cursor() |
3 |
=B2.new(EID,Mark,Dept,Gender,Name) |
>B1.append(A3) |
4 |
=A1.open().cursor().fetch() |
|
5 |
[0,true,null,null,null,2,false,Technology,M,Joe Smith] |
|
6 |
=create(EID,Mark,Dept,Gender,Name).record(A5) |
=A6.cursor() |
7 |
=file("g:/file/dw/employeesMark.ctx":[2]) |
=A7.create@yd(#EID,Mark,Dept,Gender,Name;2) |
8 |
>B7.append@i(B6) |
|
9 |
=A7.open().cursor().fetch() |
|
10 |
=file("d:/file/dw/employeesMark.ctx":[1,2]) |
|
11 |
=A10.open().cursor@w().fetch() |
=A10.open().cursor().fetch() |
在A1中,新建复组表中的一个分表,在B1中指定分表号创建组表,与employees.ctx相比,在键字段EID后,增加了更新标识字段Mark。在A3中,在组表employees.ctx生成的游标中增加Mark字段,用于在B3中将数据存入复组表的分表1中,A4中可以看到,分表中数据如下:
与前面的员工表相比,只是多出了Mark字段,值均为null。
A6中准备了一些需要修正的记录的数据,如下:
其中,EID为0的记录,Mark为true,表示需要删除,EID为2的记录,Mark为false,说明需要修改。A8中,将这些需要修改的数据存入分表2中,分表2与分表1的结构是相同的,从A9中可以看到其中的数据:
在A11中,用复组表,从两个分表中同时读取数据,生成游标时,添加了@w选项,表示需要考虑更新标识字段Mark,此时,A11中的数据如下:
如果不添加@w选项,则仍然会正常读取各个分表中的字段,此时会根据键字段归并排序,从中能够看到更新标识的初始情况: