update()

阅读(5400) 标签: 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的值更新到库里。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字段是键,键字段得包含在更新字段里。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,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分别为为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:D )

描述:

更新实表的记录。

语法:

T.update(P:D)

备注:

根据排列PD更新实表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

=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)

更新实表A2A5的键值在实表A2中存在时更新否则插入,A6的键值在A2中存在时删除,使用@n选项,返回更新和插入及删除的记录:

8

=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(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)

更新实表A2A5的键值在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)

描述:

更新虚表的记录。

语法:

T.update(P:D)

备注:

根据排列PD更新虚表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)

更新虚表A2A3键值在A2中存在则更新A2记录,不存在则插入或追加到A2A4键值在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()

读取更新后的虚表记录: