Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (P-Z)

 

UPDATE 语句 [SQL Remote]

此语句用于修改数据库中的数据。

语法 1
UPDATE table-list
SET column-name = expression, ...
[ VERIFY ( column-name, ... ) VALUES ( expression, ... ) ]
[ WHERE search-condition ]
[ ORDER BY expression [ ASC | DESC ], ... ]
语法 2
UPDATE table-name
PUBLICATION publication-name
{ SUBSCRIBE BY subscription-expression |
   OLD SUBSCRIBE BY old-subscription-expression
   NEW SUBSCRIBE BY new-subscription-expression }
WHERE search-condition
expression: value | subquery
参数
  • table-name   table-name 指示在远程数据库中必须修改的表。

  • publication-name   publication-name 指示必须为其更改预订的发布。

  • subscription-expression   SQL Remote 使用 subscription-expression 的值确定行的新接收者和现有接收者。subscription-expression 可以是一个值或一个子查询。或者,也可以提供 OLD 和 NEW 预定表达式。

  • WHERE   WHERE 子句指定要在预订的数据库间传送哪些行。

注释

UPDATE 语句用于修改一个或多个表中的行。每个指定的列被设置为等号右侧表达式的值。对 expression 没有任何限制。表达式中甚至可以使用 column-name—此时将使用旧值。

如果未指定 WHERE 子句,则更新所有行。如果指定了 WHERE 子句,则仅更新满足搜索条件的行。

通常情况下,以什么顺序更新行并不重要。但是,与 NUMBER(*) 函数一起使用时,排序可用于按指定的顺序在行中添加递增的编号。此外,如果想要执行类似向表的主键值中添加 1 这样的操作,必须按主键的降序操作,以便避免从操作中得到重复的主键。

如果定义视图的 SELECT 语句不包含 GROUP BY 子句、集合函数或不涉及 UNION 子句,则可以更新视图。

插入到表中的字符串始终以它们输入时的大小写形式存储,无论数据库是否区分大小写。因此,用字符串 Value 更新的字符数据类型列在数据库中保存的形式始终是 V 为大写,其它字母均为小写。SELECT 语句返回的字符串为 Value。但是,如果数据库不区分大小写,所有比较都会将 Value 与 value、VALUE 等不同大小写形式的字符串视为相同。而且,如果单列主键已经包含 Value 条目,则会拒绝对 value 执行 INSERT,因为它会导致主键不唯一。

可选的 FROM 子句允许根据连接更新表。如果存在 FROM 子句,WHERE 子句将限定 FROM 子句的行。仅更新表列表中紧跟在 UPDATE 关键字后面的数据。

如果使用 FROM 子句,应以同样的方式在语句的两个部分限定要更新的表名,这点很重要。如果在一个位置使用了相关名,则在另一个位置也必须使用该相关名,否则将发生错误。

语法 1 和语法 2 仅适用于 SQL Remote。

不带 OLD 和 NEW SUBSCRIBE BY 表达式的语法 2 必须用于 BEFORE 触发器中。

带 OLD 和 NEW SUBSCRIBE BY 表达式的语法 2 可在任何地方使用。

语法 1 仅用于 SQL Remote 中由消息代理执行的单行更新。VERIFY 子句包含在要更新的行中应存在的值集。如果值不匹配,则继续 UPDATE 操作之前会触发所有 RESOLVE UPDATE 触发器。如果只是 VERIFY 子句不匹配,UPDATE 不会失败。当指定 VERIFY 子句时,一次只能更新一个表。

语法 2 仅用于 SQL Remote。如果不使用 OLD 和 NEW 表达式,它必须在 BEFORE 触发器内使用,以便能够访问相关的值。其目的是每当列表更改时都提供 SUBSCRIBE BY 值的完整列表。它放在 SQL Remote 触发器中,以便数据库服务器能够计算 SUBSCRIBE BY 值的当前列表。这两个列表都放置在事务日志中。

消息代理使用这两个列表来确保将行移动到任何没有行且现在需要行的远程数据库。消息代理还从任何含有行且不再需要行的远程数据库中删除行。UPDATE 语句不影响含有行且仍然需要行的远程数据库。

UPDATE 语句的语法 2 允许显式指定旧 SUBSCRIBE BY 列表和新 SUBSCRIBE BY 列表,从而使 SQL Remote 触发器的效率更高。如果缺少这些列表,数据库服务器将计算发布定义中的旧 SUBSCRIBE BY 列表。由于新 SUBSCRIBE BY 列表与旧 SUBSCRIBE BY 列表通常只是稍微有点差别,因此可能会执行两次旧列表的计算。通过既指定旧列表又指定新列表,可以避免这种额外的工作。

当表达式用相同的预订更新同一触发器内的许多表时,OLD 和 NEW SUBSCRIBE BY 语法尤其有用。这样可以动态地提高性能。

SUBSCRIBE BY 表达式是一个值或一个子查询。

UPDATE 语句的语法 2 用于实现特定的 SQL Remote 功能,并且在 BEFORE 触发器内使用。

对于在预订表达式中用子查询创建的发布,必须编写包含 UPDATE 语句语法 2 的触发器,以便确保行都保留在它们正确的预订中。

有关此功能的完整说明,请参见使用 BEFORE UDPATE 触发器

UPDATE 语句的语法 2 在事务日志中创建项,但不更改数据库表。

权限

必须具有所修改列的 UPDATE 权限。

副作用

无。

另请参见
标准和兼容性
  • SQL/2003   服务商扩充。

示例

以下示例将雇员 Philip Chin(雇员 129)从销售部转移到市场部。

UPDATE Employees
VERIFY( DepartmentID ) VALUES( 300 )
SET DepartmentID = 400
WHERE EmployeeID = 129;