本章介绍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的值更新到库里 |
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 |
|
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,USERNAME) |
自增字段不用写表达式 |
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) |
|
备注:
根据排列P与实表T的键值更新实表T的记录,保证P的结构和实表T结构一致,如果更新数据的键值在实表中不存在,则将此记录追加(或插入)到实表T中。
参数:
T |
组表的实表 |
P |
和T同构的排列/序表 |
选项:
@i |
只处理插入,键值能找到的忽略 |
@u |
只处理更新,键值找不到的忽略 |
@n |
返回更新和插入的记录 |
@w |
P是游标与原表同序,重写P涉及的字段,该选项仅支持T列存格式时使用,不可增加记录 |
返回值:
实表
示例:
|
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序表更新基表中的数据 |
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 |
=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().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().fetch() |
读取更新后的组表文件数据内容: |
描述:
更新虚表的记录
语法:
T.update(P) |
|
备注:
根据排列P与虚表T的键值更新虚表T的记录,保证P的结构和虚表T结构一致,如果更新数据的键值在虚表中不存在,则将此记录追加(或插入)到虚表T中。
参数:
T |
虚表对象 |
P |
和T同构的排列/序表 |
选项:
@i |
只处理插入,键值能找到的忽略 |
@u |
只处理更新,键值找不到的忽略 |
@n |
返回更新和插入的记录 |
返回值:
虚表对象
示例:
|
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() |
|