Postgresql UPDATE 语句
在 PostgreSQL 数据库中,更新数据通常使用 UPDATE 语句。本章讲讲 update 的基本用法。
语法格式
[ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | ( column_name [, ...] ) = ( sub-SELECT ) } [, ...] [ FROM from_item [, ...] ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ]
参数说明
with_query -- WITH 子句允许您指定一个或多个可在 UPDATE 查询中按名称引用的子查询。有关详细信息,请参阅 Section 7.8 和 SELECT 。
table_name -- 要更新的表的名称(可选是架构限定的)。如果在表名之前指定了 ONLY,则仅在命名表中更新匹配的行。如果未指定 ONLY,则还会更新从命名表继承的任何表中的匹配行。(可选)可以在表名后指定 *,以明确指示包含后代表。
alias -- 目标表的替代名称。提供别名后,它会完全隐藏表的实际名称。例如,给定 UPDATE foo AS f,则 UPDATE 语句的其余部分必须将此表引用为 f 而不是 foo。
column_name -- 表中以 table_name 命名的列的名称。如果需要,可以使用子字段名称或数组下标来限定列名称。不要在目标列的规范中包含表的名称 — 例如,UPDATE table_name SET table_name.col = 1 无效。
expression -- 要分配给列的表达式。表达式可以使用表中此列和其他列的旧值。
DEFAULT -- 将列设置为其默认值(如果未为其分配特定的默认表达式,则为 NULL)。标识列将设置为由关联序列生成的新值。对于生成列,允许指定此项,但仅指定从其生成表达式计算列的正常行为。
sub-SELECT -- 一个 SELECT 子查询,它生成的输出列数与前面括号列列表中列出的输出列数相同。子查询在执行时必须产生不超过一行。如果它产生一行,则将其列值分配给目标列;如果未生成任何行,则将 NULL 值分配给目标列。子查询可以引用正在更新的表的当前行的旧值。
from_item -- 一个表表达式,允许其他表中的列出现在 WHERE 条件中并更新表达式。这使用与 SELECT 语句的 FROM 子句相同的语法;例如,可以指定 table name 的别名。除非您打算进行自联接(在这种情况下,它必须在from_item中与别名一起显示),否则不要将目标表作为from_item重复。
condition -- 返回 boolean 类型的值的表达式。只有此表达式返回 true 的行才会被更新。
cursor_name -- 要在 WHERE CURRENT OF 条件中使用的游标的名称。要更新的行是最近从此游标中获取的行。游标必须是 UPDATE 的目标表上的非分组查询。请注意,WHERE CURRENT OF 不能与布尔条件一起指定。有关将游标与 WHERE CURRENT OF 一起使用的更多信息,请参阅 DECLARE 。
output_expression -- 更新每行后 UPDATE 命令要计算并返回的表达式。表达式可以使用以 table_name 命名的表的任何列名或 FROM 中列出的表。写入 * 以返回所有列。
output_name -- 用于返回列的名称。
执行结果
成功完成后,UPDATE 命令将返回以下格式的命令标记:
UPDATE count
count 是更新的行数,包括值未更改的匹配行。请注意,该数字可能小于 BEFORE UPDATE 触发器抑制更新时与条件匹配的行数。如果 count 为 0,则查询未更新任何行(这不被视为错误)。
如果 UPDATE 命令包含 RETURNING 子句,则结果将类似于包含 RETURNING 列表中定义的列和值的 SELECT 语句的结果,该语句根据命令更新的行进行计算。
使用示例
将 id 为 100 的用户年龄改为"24"
update user set age=24 where id=100;
一次修改多字段,如将id 为 50 的用户年龄改为"24",名称改为"jerry"
update user set age=24, name='jerry' where id = 50;
将 id 大于 200 的用户年龄统一增加1
update user set age=age+1, name='jerry' where id = 50;