update()

阅读(2279) 标签: update,

本章介绍update()函数的多种用法。

db.update()

描述:

更新数据库表

语法:

db.update(A:A',tbl,Fi:xi,…;P,…)

根据序列/排列更新数据库表

db.update(cs,tbl,Fi:xi,…;P,…)

根据游标更新数据库表

备注:

根据A更新tbl表中的Fi,更新值为A中同名字段进行xi计算后的值。Fix省略时用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字段是键,键字段得包含在更新字段里。A1A2字段名相同。对比主键先删除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,…)

执行结果数据库中只有EID512的记录

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分别为为123的记录。

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 )

描述:

更新实表的记录

语法:

T.update(P)

 

备注:

根据排列P实表T的键值更新实表T的记录,保证P的结构和实表T结构一致,如果更新数据的键值在实表中不存在,则将此记录追加(或插入)到实表T中。如果实表有索引,则自动更新索引。

参数:

T

组表的实表

P

T同构的排列/序表

选项:

@i

只处理插入,键值能找到的忽略

@u

只处理更新,键值找不到的忽略

@n

返回更新和插入的记录

返回值:

实表

 

示例:

 

 

A

 

1

=file("D:\\emp8.ctx")

 

2

=A1.create(#EID,NAME;EID)

创建以EID为排号键,分段键的组表基表

3

=demo.cursor("select EID,NAME from employee where EID<20")

 

4

=A2.append(A3)

 

5

=A2.attach(table3,SURNAME)

在基表上增加实表table3

6

=demo.cursor("select EID,SURNAME from employee where EID< 5")

 

7

=A5.append(A6)

 

8

=create(EID,NAME).record([1,"A",10,"B"])

创建序表

 

9

=A2.update(A8)

针对基表更新EID1的记录,并追加EID10的记录

10

=create(EID,SURNAME).record([2,"a",10,"b"])

创建序表

 

11

=A5.update@i(A10)

在实表table3中插入EID10的记录,不更新EID2的记录

 

T.update( P )

描述:

更新内表的记录

语法:

T.update(P)

 

备注:

根据排列P与内表T的键值更新内表T的记录,保证P的结构和内表T结构一致,如果更新数据的键值在内表中不存在,则将此记录追加(或插入)到内表T中,新记录被添加到内表中时,主键仍然会保持有序如果内表有索引,则自动更新索引

参数:

T

内表

P

T同构的排列/序表

选项:

@i

只处理插入,键值能找到的忽略

@u

只处理更新,键值找不到的忽略

@n

返回更新和插入的记录

返回值:

内表

示例:

 

A

 

1

=demo.cursor("select EID,NAME,GENDER from employee where EID< 10")

返回游标

2

=A1.memory()

返回内表

3

=A2.keys(EID)

设置EID为内表主键

4

=create(EID,NAME,GENDER).record([1,"A","AA",10,"B","BB"])

返回序表

5

=A2.update@u(A4)

只更新

6

=A2.update(A4)

注释A5之后再运行,结果如下:

处理更新,同时追加记录

7

=A2.update@i(A4)

注释A5A6之后再运行,结果如下:

只插入

8

=A2.update@n(A4)

注释A5A6A7之后再运行,结果如下:

返回更新和插入的记录

T.update( P )

描述:

更新集群组表的记录

语法:

T.update(P)

 

备注:

根据排列P实表T的键值更新集群表T的记录,保证P的结构和实表T结构一致,如果更新数据的键值在集群表中不存在,则将此记录追加(或插入)到集群表T中。如果集群有索引,则自动更新索引。仅支持非临时集群文件,并且针对所有节点相关分区都可写入。

参数:

T

集群表

P

T同构的排列/序表

示例:

 

A

 

1

=file("emp10.ctx",["192.168.0.118:8281"])

 

2

=A1.create()

打开集群组表

3

=create(EID,NAME).record([1,"A","F",10,"B","M"])

创建序表

 

4

=A2.update(A3)

针对集群表更新EID1的记录,并追加EID10的记录