更新表的行。
语法
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
特权才能更新表,还必须对在 expression
或 condition
中读取其值的任何表具有 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 求值时替换该列的值:
|
record | 要为其字段分配 return_expression 求值结果的记录。第一个 return_expression 分配给 record 中的第一个字段,第二个 return_expression 分配给 record 中的第二个字段,以此类推。record 中的字段数量必须与表达式数量准确匹配,而且字段类型必须与为其分配的表达式类型兼容。
|
variable | 要为其分配 return_expression 求值结果的变量。如果指定多个return_expression 和 variable ,则第一个 return_expression 分配给第一个 variable ,第二个 return_expression 分配给第二个 variable ,以此类推。在 INTO 关键字之后指定的变量数量必须与在 RETURNING 关键字之后的表达式数量准确匹配,而且变量类型必须与为其分配的表达式类型兼容。
|
collection | 根据 return_expression 求值结果在其中创建元素的集合。可能存在单个集合(该集合可能是由单个字段组成的集合,也可能是由记录类型组成的集合),也可能存在多个集合(在这种情况下,每个集合必须由单个字段组成)。返回表达式的数量和顺序必须与所有指定集合中字段的数量和顺序匹配。每组对应的
return_expression 与 collection 字段的类型必须兼容。
|
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;