Postgresql SELECT 语句
Postgresql DELETE 语句 

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;