4.4.2 用序表或序列更新数据

在上面的例子中,用for循环函数将序表中的数据更新到序表。在集算器中,可以直接将序列或序表中数据,用update函数更新到序表。如:

 

A

B

C

1

1

Tom Smith

Florida

2

2

Michael Jones

Montana

3

3

William Bush

New York

4

4

Violet Taylor

Montana

5

=connect@e("demo")

>A5.execute("create table TEST(ID int,FULLNAME varchar(50), STATE varchar(20))")

 

6

=create(Fd1,Fd2,Fd3).record([A1:C4])

 

 

7

>A5.update(A6,TEST,ID:Fd1,FULLNAME:Fd2,STATE:Fd3;ID)

 

 

8

=A5.query("select * from TEST")

>A5.execute("drop table TEST")

>A5.close()

A6中序表如下:

A7中,用update函数,将序表A6中的数据更新到数据库中的TEST表,在update函数中,首先指定源数据为A6,更新到TEST,并指定各字段的对应关系,在最后指定了更新时使用的主键是ID,当主键未指定时,会自动到数据库中寻找主键。在A8中查询出的结果如下:

可以看到,update函数更新数据库,与前面例子中用for循环的结果是类似的。

在设定了更新时使用的主键后,如果数据库中已经存在了主键相同的数据,结果会如何呢?我们看看下面的例子:

 

A

B

C

1

1

Tom Smith

Florida

2

2

Michael Jones

Montana

3

3

William Bush

New York

4

4

Violet Taylor

Montana

5

=connect@e("demo")

>A5.execute("create table TEST(ID int,FULLNAME varchar(50), STATE varchar(20))")

 

6

>demo.execute("insert into TEST values (1,'TOM SMITH','FL')")

>demo.execute("insert into TEST values (20,'MICHAEL','MT')")

=demo.query("select * from TEST")

7

=create(Fd1,Fd2,Fd3).record([A1:C4])

 

 

8

>A5.update(A7,TEST,ID:Fd1,FULLNAME:Fd2,STATE:Fd3;ID)

 

 

9

=A5.query("select * from TEST")

>A5.execute("drop table TEST")

>A5.close()

A6B6中在TEST中预先插入2条记录,从C6中读出在用update函数更新前,TEST中数据如下:

A8中执行update函数后,在A9中查到TEST中数据如下:

可以发现,主键相同的数据被更新了,而主键不同的MICHAEL的数据仍然存在。

 

使用update函数时,还可以用一些选项来进行不同的操作:@u表示只更新数据,而不插入新记录;@i表示只插入数据,而不更新已有的数值;@a表示在更新前清空目标表中的所有记录;@1表示第一个字段为自增字段,更新时不对它赋值。

如将上例中A8中的语句修改为=A5.update@u(A7,TEST,ID:Fd1,FULLNAME:Fd2,STATE:Fd3;ID)A9中查到的结果如下:

A8执行update@u时,只修改已存在的记录。

若将上例中A8中的语句修改为=A5.update@a(A7,TEST,ID:Fd1,FULLNAME:Fd2,STATE:Fd3;ID)A9中查到的结果如下:

A8执行update@a前,将删除表中原有的记录。使用update@a(),可以保证表中的数据与更新时使用过的源数据保持一致。

 

与直接执行SQL类似,用update函数时,也可以使用@k选项,此时需要考虑对数据库连接的控制,相关内容可以阅读4.3控制连接