更新表的行。

语法

UPDATE [ optimizer_hint ] table[subquery][@dblink ]
    SET column = { expression | DEFAULT } [, ...]
  [ WHERE condition ]
  [ RETURNING return_expression [, ...]
      { INTO { record | variable [, ...] }
      | BULK COLLECT INTO collection [, ...] } ]

说明

UPDATE 更改满足条件的所有行中指定列的值。只需在 SET 子句中提及要修改的列;未显式修改的列保留其先前的值。

只能在 SPL 程序中指定 RETURNING INTO { record | variable [, ...] } 子句。此外,UPDATE 命令的结果集不能返回多个行,否则将引发异常。如果结果集为空,则将目标记录或变量的内容设置为 null。

只有在 SPL 程序中使用 UPDATE 命令时,才能指定 RETURNING BULK COLLECT INTO collection [, ...] 子句。如果将多个 collection 指定为 BULK COLLECT INTO 子句的目标,则每个 collection 必须包含一个标量字段,即 collection 不得为记录。UPDATE 命令的结果集可以包含零个、一个或多个行。针对结果集的每一行,return_expression 的求值结果成为 collection 中的元素,从第一个元素开始。会删除 collection 中的所有现有行。如果结果集为空,则 collection 也将为空。

必须对表具有 UPDATE 特权才能更新表,还必须对在 expressioncondition 中读取其值的任何表具有 SELECT 特权。

参数

参数 说明
optimizer_hint 向优化程序提供的注释嵌入式提示,用于选择执行计划。
table 要更新的表的名称(可能是 schema 限定的)。
dblink 用于标识远程数据库的 database link 名称。有关 database link 的信息,请参见 CREATE DATABASE LINK 命令。
column 表中的列名。
expression 要分配给列的表达式。表达式可以使用表中此列和其他列的旧值。
DEFAULT 将列设置为其默认值(如果没有为其分配特定的默认表达式,则为 null)。
condition 返回 BOOLEAN 类型的值的表达式。将仅更新此表达式返回 true 的行。
return_expression 可能包括表中一列或多列的表达式。如果在 return_expression 中指定表中的列名,则按如下方式确定在对 return_expression 求值时替换该列的值:
  • 如果在 UPDATE 命令中为 return_expression 中指定的列分配一个值,则在计算 return_expression 时使用指定的值。
  • 如果未在 UPDATE 命令中为 return_expression 中指定的列分配值,则受影响的行中列的当前值将用于计算 return_expression
record 要为其字段分配 return_expression 求值结果的记录。第一个 return_expression 分配给 record 中的第一个字段,第二个 return_expression 分配给 record 中的第二个字段,以此类推。record 中的字段数量必须与表达式数量准确匹配,而且字段类型必须与为其分配的表达式类型兼容。
variable 要为其分配 return_expression 求值结果的变量。如果指定多个return_expressionvariable,则第一个 return_expression 分配给第一个 variable,第二个 return_expression 分配给第二个 variable,以此类推。在 INTO 关键字之后指定的变量数量必须与在 RETURNING 关键字之后的表达式数量准确匹配,而且变量类型必须与为其分配的表达式类型兼容。
collection 根据 return_expression 求值结果在其中创建元素的集合。可能存在单个集合(该集合可能是由单个字段组成的集合,也可能是由记录类型组成的集合),也可能存在多个集合(在这种情况下,每个集合必须由单个字段组成)。返回表达式的数量和顺序必须与所有指定集合中字段的数量和顺序匹配。每组对应的 return_expressioncollection 字段的类型必须兼容。
subquery 子查询语句。

示例

将 dept 表中第 20 部门的位置更改为 AUSTIN:

UPDATE dept SET loc = 'AUSTIN' WHERE deptno = 20;

对于 emp 表中job = SALESMAN 的所有员工,将工资提升 10% 并将佣金增加 500。

UPDATE emp SET sal = sal * 1.1, comm = comm + 500 WHERE job = 'SALESMAN';

select * from table1的结果作为一个目标对象,将目标对象的列class修改为1:

UPDATE (SELECT * FROM table1) SET class = 1 WHERE id = 1;