↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 8.0 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

UPDATE

UPDATE — 更新表中的行

大纲

UPDATE [ ONLY ] table SET column = { expression | DEFAULT } [, ...]
    [ FROM fromlist ]
    [ WHERE condition ]

描述

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

默认情况下,UPDATE会更新指定表及其所有子表中的行。 如果只想更新所提及的那个表,必须使用ONLY子句。

有两种方法可以利用数据库中其他表所包含的信息来修改一个表:使用子选择, 或者在FROM子句中指定附加表。哪种技术更合适取决 于具体情况。

必须拥有该表上的UPDATE权限才能更新它,同时,对于在expression或condition中读取其值的任何表,还必须拥有SELECT权限。

参数

table

要更新的表名(可以是模式限定的)。

column

table表中某一列的名称。如有需要, 列名可以使用子字段名或数组下标进行限定。

expression

要赋给该列的表达式。该表达式可以使用该表中这一列和其他列的 旧值。

DEFAULT

把该列设置为其默认值(如果没有为它指定特定的默认表达式,则该值为 NULL)。

fromlist

一个表表达式列表,允许其他表的列出现在WHERE条件以及更新表达式中。这类似于SELECT语句的FROM Clause中可以指定的表列表。注意,除非打算进行自连接(此时它必须在fromlist中带有别名出现),否则目标表不能出现在fromlist中。

condition

一个返回boolean类型值的表达式。只有使这个表达式返 回true的行才会被更新。

输出

成功完成后,UPDATE 命令返回如下形式的命令标签:

UPDATE count

count是被更新的行数。如果 count为 0,说明没有行匹配condition(这不被视为 错误)。

注解

当存在FROM子句时,本质上会将目标表与 fromlist中提到的表连接起来,而连接 的每一条输出行都代表对目标表的一次更新操作。使用 FROM时,应确保对每一个要修改的目标行,连接至多 生成一条输出行。换言之,一条目标行不应与其他表中的多于一行成功 连接。如果发生这种情况,则只会使用其中某一条连接行来更新目标行, 但具体使用哪一条并不容易预测。

因为存在这种不确定性,所以仅在子选择中引用其他表会更安全,尽管 这种写法通常比使用连接更难阅读、也更慢。

示例

把表films的kind 列中的单词Drama改为Dramatic:

UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';

在表weather的一行中调整温度项,并将降水量 重置为其默认值:

UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
  WHERE city = 'San Francisco' AND date = '2003-07-03';

将负责 Acme Corporation 账户的销售人员的销量计数加一,使用 FROM 子句语法:

UPDATE employees SET sales_count = sales_count + 1 FROM accounts
  WHERE accounts.name = 'Acme Corporation'
  AND employees.id = accounts.sales_person;

执行同样的操作,在 WHERE 子句中使用子选择:

UPDATE employees SET sales_count = sales_count + 1 WHERE id =
  (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation');

尝试插入一个新库存项及其库存量。如果该项已存在,则改为更新现有项的库存量。要在不致使整个事务失败的情况下做到这一点,请使用保存点:

BEGIN;
-- 其他操作
SAVEPOINT sp1;
INSERT INTO wines VALUES('Chateau Lafite 2003', '24');
-- 假设上面的语句因唯一键冲突而失败,
-- 那么现在发出这些命令:
ROLLBACK TO sp1;
UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003';
-- 继续执行其他操作,最后
COMMIT;

兼容性

这个命令符合SQL标准,只是FROM子句是 PostgreSQL的一个扩展。

某些其他数据库系统提供一种 FROM 选项,其中目标表被认为要在 FROM 中再次列出。PostgreSQL 不是这样解释 FROM 的。移植使用这一扩展的应用时要小心。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。