本章介绍update()函数的多种用法。
描述:
更新数据库表。
语法:
db.update(A:A',tbl,Fi:xi,…;P,…) |
根据序列/排列更新数据库表。 |
db.update(cs,tbl,Fi:xi,…;P,…) |
根据游标更新数据库表。 |
备注:
根据A更新tbl表中的Fi,更新值为A中同名字段进行xi计算后的值。Fi和x省略时用A的同名字段名和字段值。
P,…是tbl的键。有A'时先用键与A'做对比,并生成删除指令(删除数据库中A'有A没有的记录),当主键在A中存在A'中不存在时在数据库中插入该条记录,如果主键同时在A'和A中存在,再比较数据值,即比较A中同名字段执行xi计算后的字段值与Fi 的值是否相同,若不同则将A执行xi计算后的字段值更新到数据库。
无A'参数时,只进行插入与更新操作,无删除操作。
参数:
db |
数据库连接。 |
A |
序列/排列。 |
cs |
游标。 |
A' |
原始序列/排列,一般认为和数据库中数据一致。 |
tbl |
数据库里的表名。 |
Fi |
tbl 的字段。 |
xi |
A的表达式,利用A算出xi,作为Fi的值更新到库里。xi省略时认为与Fi相同。 |
P |
tbl的键,省略将从tbl中读,读不出用A的。 |
选项:
@u |
对比主键只生成UPDATE。无A'时不再对比,直接用A更新到数据库。 |
@i |
对比主键只生成 INSERT。无A'时不再对比,直接用A插入到数据库。 |
@a |
执行前清空目标表。先清空数据库表中的数据,再执行db.update(A:A',tbl,Fi:xi,…;P,…)。 |
@k |
|
@1 |
第一个字段是自增字段,没有对应表达式。 |
@d(A:A',tbl,Fi:xi,…;P,…) |
只删除,此时必须有A'。 |
返回值:
无
示例:
|
A |
|
1 |
=demo.query("select * from EMPLOYEE").keys(EID) |
|
2 |
=file("D:/employee1.txt").import@t() |
|
3 |
>demo.update(A2:A1,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
EID字段是键,键字段得包含在更新字段里。A1和A2字段名相同。对比主键先删除A1中有A2中没有的记录,再插入A2中有A1中没有的记录,最后对比主键更新记录值,并对有变化的记录的SALARY字段值更新为A2.SALARY+10。 |
4 |
>demo.update@u(A2:A1,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
使用@u选项时只更新记录值,并对有变化的记录的SALARY字段值更新为A2.SALARY+10。 |
5 |
>demo.update@u(A2,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
无A'时不再对比,直接将进行xi计算后的A2的记录更新到数据库。 |
6 |
>demo.update@i(A2:A1,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
使用@i选项时只插入记录值,并对记录的SALARY字段做SALARY+10运算。 |
7 |
>demo.update@i(A2,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
无A'时不再对比,直接将进行xi计算后的A2的记录插入到数据库。 |
8 |
>demo.update@a(A2:A1,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
先清空数据库中EMPLOYEE表中的数据,再执行db.update(A:A',tbl,Fi:xi,…;P,…)。 执行结果数据库中只有EID为512的记录。 |
9 |
=file("D:/data_user.txt").import@t() |
|
10 |
=mysql.query("select * from user_test").keys(USERID) |
mysql数据库中user_test表中的键userid为自增字段。 |
11 |
>mysql.update@1(A9:A10,user_test,USERID:#,USERNAME;USERID) |
忽略自增字段表达式的值。 |
12 |
>demo.update@k(A2:A1,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
完成后不提交事务。 |
13 |
>demo.update@d(A2:A1,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
对比键只删除数据库中A1中有A2中没有的记录。执行结果数据库中只有EID分别为为1、2、3的记录。 |
14 |
=file("D://data.txt").cursor@t() |
|
15 |
>demo.update(A14,EMPLOYEE,EID,NAME,SURNAME,GENDER,STATE,BIRTHDAY,HIREDATE,DEPT,SALARY:SALARY+10;EID) |
A14为游标。 |
描述:
更新实表的记录。
语法:
T.update(P:D)
备注:
根据排列P与D更新实表T的记录,保证P的结构和实表T结构一致;
P的键值在实表T中存在则更新该条记录,P的键值在T中不存在,则将此记录插入到T中。
D的键值在T中存在则删除该条记录,参数D可以省略。
参数P和D都存在时,先计算P再计算D。
实表T没有维时忽略D,此时P中数据全部追加到T的末尾。
参数:
T |
组表的实表。 |
P |
要更新的内容,和T同构的排列/序表,可省略。 |
D |
根据D的键值删除T的记录,可省略。 |
选项:
@i |
只处理插入,键值能找到的忽略。 |
@u |
只处理更新,键值找不到的忽略。 |
@n |
返回更新/插入/删除的记录。 |
@w |
P是游标与原表同序,重写P涉及的字段,该选项仅支持T列存格式时使用,不可增加记录。 |
@y |
保持在内存,在计算时归并,不写入外存。 |
返回值:
实表
示例:
更新实表数据:
|
A |
|
1 |
=file("emp.ctx") |
生成组表文件。 |
2 |
=A1.create@y(#EID,NAME) |
创建组表的基表。 |
3 |
=connect("demo").cursor("select EID,NAME from employee where EID<20") |
返回游标。 |
4 |
=A2.append@i(A3) |
将A3游标中的数据追加到组表的基表中。 |
5 |
=A2.attach(table3,SURNAME) |
在基表上增加名为table3的附表,EID为键,SURNAME为字段。 |
6 |
=connect("demo").cursor("select EID,SURNAME from employee where EID< 5") |
返回游标。 |
7 |
=A5.append@i(A6) |
将A6游标中的数据追加到附表table3中。 |
8 |
=A2.cursor().fetch() |
查看基表中的数据。
|
9 |
=A5.cursor().fetch() |
查看附表中的数据:
|
10 |
=create(EID,NAME).record([1,"A",21,"B"]) |
返回序表。 |
11 |
=A2.update(A10) |
根据A8序表更新基表中的数据,A10序表键值在基表中存在时更新记录,键值不存在时追加记录。 |
12 |
=A2.cursor().fetch() |
此时查看基表中的数据:
|
13 |
=create(EID,SURNAME).record([2,"aa",10,"bb"]) |
返回序表。 |
14 |
=A5.update@in(A13) |
使用@i选项,只处理插入,相同键值的忽略,组合使用@n选项,返回插入的记录:
|
15 |
=A5.cursor().fetch() |
此时查看附表中的数据:
|
16 |
=create(EID,SURNAME).record([1,"ss",6,"cc"]) |
返回序表。 |
17 |
=A5.update@un(A16) |
使用@u选项,只处理更新,键值不同的忽略,组合使用@n选项,返回更新的记录:
|
18 |
=A5.cursor().fetch() |
此时查看附表中的数据:
|
删除实表数据:
|
A |
|
1 |
=file("empD.ctx") |
|
2 |
=A1.create@y(#EID,NAME) |
创建EID为键的组表。 |
3 |
=connect("demo").cursor("select top 10 EID,NAME from employee") |
返回游标,其中数据内容如下:
|
4 |
=A2.append@i(A3) |
将A3游标中的数据追加到实表A2中。 |
5 |
=create(EID,NAME).record([10,"bb",11,"cc"]) |
生成序表:
|
6 |
=create(EID,NAME).record([1,"Rebecca"]) |
生成序表:
|
7 |
=A2.update@n(A5:A6) |
更新实表A2,A5的键值在实表A2中存在时更新否则插入,A6的键值在A2中存在时删除,使用@n选项,返回更新和插入及删除的记录:
|
8 |
=A2.import() |
此时读取实表A2的数据如下:
|
P、D中存在同键值记录时:
|
A |
|
1 |
=file("empPD.ctx") |
|
2 |
=A1.create@y(#EID,NAME) |
创建EID为键的组表。 |
3 |
=connect("demo").cursor("select top 10 EID,NAME from employee") |
返回游标,其中数据内容如下:
|
4 |
=A2.append@i(A3) |
将A3游标中的数据追加到实表A2中。 |
5 |
=create(EID,NAME).record([1,"bb",2,"cc"]) |
生成序表:
|
6 |
=create(EID,NAME).record([1,]) |
生成序表:
|
7 |
=A2.update@n(A5:A6) |
更新实表A2,A5的键值在实表A2中存在则更新,A6的键值在A2中存在时删除,使用@n选项,返回更新和插入及删除的记录:
|
8 |
=A2.import() |
由于P、D参数同时存在时先执行P再执行D,所以键值为1的记录最终会被删除掉,读取实表A2的数据如下:
|
实表没有维的情况:
|
A |
|
1 |
=file("empD.ctx") |
|
2 |
=A1.create@y(EID,NAME) |
创建组表。 |
3 |
=connect("demo").cursor("select top 10 EID,NAME from employee") |
返回游标,其中数据内容如下:
|
4 |
=A2.append@i(A3) |
将A3游标中的数据追加到实表A2中。 |
5 |
=create(EID,NAME).record([10,"bb"]) |
生成序表:
|
6 |
=create(EID,NAME).record([1,"Rebecca"]) |
生成序表:
|
7 |
=A2.update(A5:A6) |
实表A2无维,所以更新时忽略参数D,并且将P中的所有记录追加进实表,所以此处将A5的记录全部追加进实表,忽略此处的参数A6。 |
8 |
=A2.import() |
此时读取实表A2的数据如下:
|
使用@y选项:
|
A |
|
1 |
=file("empD.ctx") |
|
2 |
=A1.create@y(#EID,NAME) |
创建组表。 |
3 |
=connect("demo").cursor("select top 10 EID,NAME from employee") |
返回游标,其中数据内容如下:
|
4 |
=A2.append@i(A3) |
将A3游标中的数据追加到实表A2中。 |
5 |
=create(EID,NAME).record([1,"Rebecca"]) |
生成序表:
|
6 |
=A2.update@y(:A5) |
更新实表A2,A5的键值在A2中存在时删除,使用@y选项,更新保存在内存中,计算时才归并。 |
7 |
=A2.import() |
此时查看实表内容:
|
8 |
=A2.close() |
关闭实表。 |
9 |
=A1.open().import@x() |
重新打开实表,读取实表中的数据,可以看到A6中的更新内容已经被还原:
|
使用@w选项:
|
A |
|
1 |
=demo.cursor("select STOCKID,DATE,CLOSING from STOCKRECORDS where STOCKID = ? and DATE<?","000062","2015-01-20") |
|
2 |
=file("STOCKRECORDS.ctx") |
创建组表文件。 |
3 |
=A2.create@y(#STOCKID,DATE,CLOSING) |
创建组表的基表。 |
4 |
=A3.append@i(A1) |
将A1游标中的数据追加到组表基表中。 |
5 |
=A2.open().cursor@x().fetch() |
读取组表数据内容:
|
6 |
=demo.cursor("select STOCKID,DATE from STOCKRECORDS where STOCKID = ?","000792") |
|
7 |
=A2.open() |
|
8 |
=A7.update@w(A6) |
将游标A6的内容更新到组表STOCKRECORDS.ctx中,使用@w选项,重写A6涉及的字段,即:将A6中的STOCKID,DATE字段更新到组表A7中,A7中的CLOSING字段内容保持不变,并且更新时不增加新的记录 ,保持组表A7原有的记录条数。 |
9 |
=A7.cursor@x().fetch() |
读取更新后的组表文件数据内容:
|
更新虚表的记录。
T.update(P:D)
备注:
根据排列P与D更新虚表T的记录,保证P的结构和虚表T结构一致;
P的键值在虚表T中存在则更新该条记录,P的键值在T中不存在,则将此记录追加或插入到T中。
D的键值在T中存在则删除该条记录,参数D可以省略。
虚表T没有维时忽略D,此时P中数据全部追加到T的末尾。
参数:
T |
虚表对象。 |
P |
要更新的内容,和T同构的排列/序表,可省略。 |
D |
根据D的键值删除T的记录,可省略。 |
选项:
@i |
只处理插入,键值能找到的忽略。 |
@u |
只处理更新,键值找不到的忽略。 |
@n |
返回更新和插入及删除的记录。 |
@w |
P是游标与原表同序,重写P涉及的字段,该选项仅支持T列存格式时使用,不可增加记录。 |
@y |
保持在内存,在计算时归并,不写入外存。 |
返回值:
虚表对象
示例:
|
A |
|
1 |
=create(file).record(["D:/file/pseudo/Employee.ctx"])
|
|
2 |
=pseudo(A1)
|
生成虚表对象。 |
3 |
=create(Dept,AvgSalary).record(["HR",7000,"CSD",6018.04]) |
返回序表。 |
4 |
=A2.update(A3) |
将A3中的虚表记录按键值更新虚表A2的记录。 |
5 |
=A4.import() |
|
返回更新、插入、删除的记录:
|
A |
|
1 |
=create(file).record(["empD.ctx"]) |
empD.ctx组表内容:
|
2 |
=pseudo(A1) |
生成虚表对象。 |
3 |
=create(EID,NAME).record([10,"bb",11,"cc"]) |
返回序表:
|
4 |
=create(EID,NAME).record([1,"aaa",12,"ww"]) |
返回序表:
|
5 |
=A2.update@n(A3:A4) |
更新虚表A2,A3键值在A2中存在则更新A2记录,不存在则插入或追加到A2,A4键值在A2中存在时删除该条记录,使用@n选项,返回更新、插入、删除的记录:
|
6 |
=A2.import() |
此时读取虚表A2中的数据:
|
没有维的情况:
|
A |
|
1 |
=file("empD.ctx") |
|
2 |
=A1.create@y(EID,NAME) |
创建组表。 |
3 |
=connect("demo").cursor("select top 10 EID,NAME from employee") |
返回游标,其中数据内容如下:
|
4 |
=A2.append@i(A3) |
将A3游标中的数据追加到虚表A2中。 |
5 |
=create(file).record(["empD.ctx"]) |
|
6 |
=pseudo(A5) |
生成虚表对象。 |
7 |
=create(EID,NAME).record([10,"bb",11,"cc"]) |
生成序表:
|
8 |
=create(EID,NAME).record([1,"Rebecca"]) |
生成序表:
|
9 |
=A6.update(A7:A8) |
虚表无维的情况下,更新时忽略参数D,并且将P中的所有记录追加进虚表,所以此处将A7的记录全部追加进虚表,忽略此处的参数A8。 |
10 |
=A9.import() |
此时读取虚表A9的数据如下:
|
使用@y选项,更新保持在内存:
|
A |
|
1 |
=create(file).record(["em.ctx"]) |
返回虚表定义记录。 |
2 |
=pseudo(A1) |
生成虚表定义对象。 |
3 |
=A2.import() |
读取虚表数据:
|
4 |
=create(EID,NAME).record([1,"AAAA"]) |
返回序表:
|
5 |
=A2.update@y(A4) |
将A4序表中的记录更新到虚表中,使用@y选项,更新内容保持在内存。 |
6 |
=A2.import() |
此时读取虚表数据,可以看到A5中更新的内容:
|
7 |
>A2.close() |
关闭虚表。 |
8 |
=pseudo(A1).import() |
读取虚表数据,A5中使用@y选项,更新的内容不写入外存,所以返回结果同A3:
|
使用@w选项:
|
A |
|
1 |
=connect("demo").cursor("select top 5 STOCKID,DATE,CLOSING from STOCKRECORDS where STOCKID = ? ","000062") |
返回游标。 |
2 |
=file("STOCKRECORDS.ctx") |
|
3 |
=A2.create@y(#STOCKID,DATE,CLOSING) |
创建组表文件,包含STOCKID,DATE,CLOSING列,其中STOCKID为键。 |
4 |
=A3.append@i(A1) |
将A1游标中的数据追加到组表中。 |
5 |
=create(file).record(["STOCKRECORDS.ctx"]) |
|
6 |
=pseudo@v(A5) |
生成虚表对象,组表上的虚表时,使用@v选项,使用纯序表列式计算。 |
7 |
=A6.import() |
获取虚表中的数据:
|
8 |
=connect("demo").cursor("select top 7 STOCKID,DATE from STOCKRECORDS where STOCKID = ?","000792") |
返回游标,内容如下:
|
9 |
=A6.update@w(A8) |
更新虚表记录,使用@w选项,重写P涉及的字段,不增加记录。 |
10 |
=A9.import() |
读取更新后的虚表记录:
|