VFP6.0
update - sql 命令
以新值更新表中的记录。
语法
UPDATE [DatabaseName1!]TableName1
SET Column_Name1 = eExpression1
[, Column_Name2 = eExpression2 ...]
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
参数
UPDATE [DatabaseName1!]TableName1
TableName1 指定要更新记录的表。
DatabaseName1 指定包含表的非当前数据库名。如果包含表的数据库不是当前数据库,则应包含这个数据库名。在数据库名称与表名之间有一个感叹号 (!)。
SET Column_Name1 = eExpression1
[, Column_Name2 = eExpression2
指定要更新的列以及这些列的新值。如果省略了 WHERE 子句,在列中的每一行都用相同的值更新。
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
指定要更新的记录。
FilterCondition 指定要更新的记录所符合的条件。可以根据需要加入多个筛选条件,条件之间用 AND 或 OR 操作符连接。也可以用 NOT 操作符对逻辑表达式的值取反,或者使用 EMPTY( ) 函数检查字段是否为空。
说明
UPDATE-SQL 命令只能用来更新单个表中的记录。
与 REPLACE 命令不同的是,在更新可共享访问的表中的多个记录时,UPDATE-SQL 命令使用了记录锁。在多用户的情况下,使用记录锁能减少记录竞争,但是可能会降低使用性能。为了达到最好的性能,请以独占使用方式打开表或用 FLOCK( )
函数锁定表。
Visual FoxPro 9.0 语言参考
UPDATE - SQL 命令
用新值更新表中的记录。
注意:
SQL UPDATE 命令只能更新单个表中的记录。
UPDATE Target
SET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...]
[FROM [FORCE] Table_List_Item [[, ...] | [JOIN [ Table_List_Item]]]
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]
参数
UPDATE Target
指定一个目标表, 临时表, 表或临时表的别名, 或要更新的文件。可以在 FROM 子句中包含多个数据源用于更新操作。Target 可以用下面的语法:
[DatabaseName!]TableName DatabaseName! 如果表在非当前数据库中,指定一个包含表的数据库名。如果表在非当前数据库中,必须包含数据库名。用一个惊叹号(!)分隔数据库名与表名。 TableName 指定要进行更新操作的表名。
Alias Alias 指定一个要进行更新操作的 FROM 子句中表或当前数据工作期中临时表的别名。
FileName FileName 指定一个要进行更新操作的文件名。
SET Column_Name1= eExpression1 [, Column_Name2 = eExpression2 ...] *NEW VFP9-用法变化
指定要进行更新的表中的列及其新值。如果省略 WHERE 子句,表中的每一行都用相同的值更新。如果想在表达式中使用某个对象的属性,需要将属性赋值给一个内存变量,然后在表达式中使用这个变量。例如,您可以指定 x = oColField("iid").Value ,然后在您的 UPDATE - SQL 命令中使用 SET 子句 set iid = x 。如果在表达式中直接引用对象属性,如 objectname.property,命令将把其当作别名对待,并使命令失败。可以在 SET 子句包含一个子查询(subquery)来指定表达式。如果子查询(subquery)没有返回任何结果,则其返回 NULL 。有关子查询(subquery)的语法和信息,请参见 SELECT - SQL 命令 - FROM 子句。 注意:
如果在 SET 子句中使用子查询(subquery),则不能在 WHERE 子句中使用子查询(subquery)。一个在 SET 子句中的子查询(subquery)必须正确运用, 与在关系操作中使用的子查询相同。
[FROM [FORCE] Table_List_Item[[, ...] | [JOIN [ Table_List_Item]]] *NEW VFP9
指定一个或多个表,其中包含在更新操作中所用到的数据。除以下限制之外,FROM 子句的语法与在 SQL SELECT 命令中的的语法相同:
目标表或临时表不能包含在一个 OUTER 连接中作为一个次级表或临时表。
在目标表中执行一个 JOIN 操作前,它应该对所有其它 JOIN 操作求值。
目标临时表不能由子查询(subquery)产生。
更多的信息,请参见 SELECT - SQL 命令。FORCE 指定 Table_List 中的表将加入顺序,显示在 FROM 子句中。注意:
如果省略 FORCE,则 Visual FoxPro 试图优化更新操作。但是,通过包含 FORCE 关键字禁止对 Visual FoxPro 更新进行优化来执行删除操作,可能更快。
Table_List_Item 可以用下面的语法:
[DatabaseName!]Table [[AS] Local_Alias] DatabaseName! 如果表在非当前数据库中,指定一个包含表的数据库名。如果表在非当前数据库,必须包含数据库名。在数据库名后面、表名前面使用一个惊叹号(!)作为分隔符。 Table 指定想要从中得到更新数据的表或临时表名。如果没有打开表,Visual FoxPro 显示打开对话框,您可以从中指定文件位置。打开表之后,保持打开一直到查询成功。 Local_Alias 为 Table 中指定的表指定一个临时名。如果指定了一个本地别名,必须在整个 UPDATE 语句中用本地别名代替表名。别名可以表示一个表或一个临时表。 JOIN 指明了可以容纳多少指定的一个或多个次级表。不限制每一条 UPDATE 语句代码中表, 别名, 或 JOIN 子句的数量。
(Subquery) AS Subquery_Alias 一个子查询(subquery)指定了在另一个 SELECT 语句中的一个 SELECT 语句。有关在 SELECT 语句中子查询(subquery)的更多信息,请参见 SELECT - SQL 命令 中的 FROM 子句。
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]] *NEW VFP9 操作范围变化
指定一个或多个筛选条件,记录必须符合条件才用新值更新。在 WHERE 子句中不限制筛选条件的个数。要对逻辑表达式的值求反,可以使用 NOT 操作符。要防止空字段,可使用 EMPTY( ) 函数,更多的信息,请参见 EMPTY( ) 函数。
说明
想要确定被更新的记录数,可以在执行 SQL UPDATE 命令之后立即检查 _TALLY 系统内存变量的值。更多的信息,请参见 _TALLY 系统内存变量。
提示:
不同于 REPLACE 命令,当更新以共享访问方式打开的表的多条记录时,SQL UPDATE 使用记录锁。在多用户情况下,使用记录锁能减少记录竞争,但是可能会降低性能。为了达到最佳性能,应以独占方式打开表或使用 FLOCK( ) 函数所定表。更多的信息,请参见 FLOCK( ) 函数。
在 SET 中,Visual FoxPro 处理继续的任务 (译者注:执行一个后再执行下一个) 。例如,如果发出命令:UPDATE table1 SET field1 = field2, field2=field1, 两个字段的值不交换,而是 F1 和 F2 的值相同。
旧版代码示例
示例 1
下例使用 OPEN DATABASE 命令打开 Visual FoxPro 示例数据库,并用 USE 命令打开 TestData.dbc 数据库中的 Customer 表。SQL UPDATE 语句更新 MaxOrdAmt 字段的所有值为"25"。
复制代码
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
USE Customer
UPDATE Customer SET MaxOrdAmt = 25
BROWSE FIELDS Company, MaxOrdAmt
更多的信息,请参见 USE 命令 和 BROWSE 命令。
示例 2
下例使用 OPEN DATABASE 命令打开 Visual FoxPro 示例数据库, TestData.dbc 。用 SQL SELECT 命令取得 TestData.dbc 数据库中 Products 表的数据存储到 MyProductsList 表,并显示新表。
用 CREATE CURSOR 命令创建 MyUpdateTable ,其中包含一个整型字段 Prod_Unit ,值为 10,然后显示该表。
SQL UPDATE 命令以 MyUpdateTable 表中的值更新 MyProductsList 表中产品名称为"Chai" 的 In_Stock 字段。用 SQL SELECT 命令取得并显示对 MyProductsList 表的查询, 展示出产品名称为"Chai"的被更新的 In_Stock 字段。
复制代码
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
SELECT in_stock, prod_name ;
FROM Products ;
INTO TABLE MyProductsList.dbf
BROWSE
CREATE CURSOR MyUpdateTable (prod_unit I(10))
INSERT INTO MyUpdateTable (prod_unit) VALUES (10)
BROWSE
UPDATE MyProductsList ;
SET MyProductsList.in_stock = MyUpdateTable.prod_unit ;
FROM MyUpdateTable ;
WHERE MyProductsList.prod_name = "Chai"
SELECT * FROM MyProductsList
更多的信息,请参见 OPEN DATABASE 命令,BROWSE 命令,CREATE CURSOR - SQL 命令 和 INSERT - SQL 命令。
新功能代码示例 *NEW VFP9
示例 3
下例展示了在 UPDATE 语句的 SET 子句中的表达式使用一个子查询(subquery)。用此查询更新 products 表中的所有记录。如果在 mfg_msrp 表中存在不匹配的 productID,则字段 unitprice 设置为 NULL。
复制代码
UPDATE products ;
SET unitprice = ;
(SELECT (msrp*.90) ;
FROM mfg_msrp ;
WHERE mfg_msrp.productID = products.productID ;
AND mfg_msrp.discontinued = .f.)
示例 4
下例展示了一个关联更新,只有符合 WHERE 子句中筛选条件的记录才被更新。
复制代码
UPDATE products ;
SET unitprice = mfg_msrp.msrp*.90 ;
FROM mfg_msrp ;
WHERE mfg_msrp.productID = products.productID;
AND mfg_msrp.discontinued = .f.
示例 5
下例是一个关联更新,更新结果中仅包含第一条寻找到的匹配记录。其它匹配的记录被忽略。示例代码指定了两个临时表。第一个是更新目标。第二个是更新的源,且内容中有二条与目标临时表第一条记录进行交换,不是更新所有目标临时表中记录。在结果中,第一条记录的值是第一个匹配 .50 ,而不是第二个匹配 10.00。
复制代码
CLOSE DATABASES ALL
CREATE CURSOR MyProducts (ProdID I , ProdCategory I NULL, MSRP Y NULL)
INSERT INTO MyProducts VALUES (1,9,1.00)
INSERT INTO MyProducts VALUES (2,8,2.00)
INSERT INTO MyProducts VALUES (3,7,3.00)
CREATE CURSOR MyUpdates (ProdID I , MSRP Y)
INSERT INTO MyUpdates VALUES (1,.50) && 匹配并更新.
INSERT INTO MyUpdates VALUES (2,20.00) && 匹配并更新.
INSERT INTO MyUpdates VALUES (4,40.00) && 不匹配
INSERT INTO MyUpdates VALUES (1,10.00)&& 第二次匹配,但不更新.
UPDATE MyProducts SET MSRP=MyUpdates.MSRP FROM MyUpdates WHERE MyProducts.ProdID=MyUpdates.ProdID
SELECT MyProducts
BROWSE