pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
对数据库中已有数据的修改称为更新。你可以更新单独的行、表中 的所有行或所有行的一个子集。每一列都可以单独更新;其他列 不受影响。
要执行一次更新,你需要三条信息:
要更新的表和列的名称,
列的新值,
要更新哪些行。
回想第 5 章中所说的,SQL 一般不为行提供唯一的 标识符。因此不一定能直接指定要更新哪一行。相反,你指定的 是行必须满足什么条件才会被更新。只有当表中有主键时(无论 你是否声明了它),你才能通过选择一个与主键匹配的条件来 可靠地定位单独的行。图形化的数据库访问工具正是依靠这一点 来让你逐行更新的。
例如,这条命令把所有价格为 5 的产品的价格更新为 10:
UPDATE products SET price = 10 WHERE price = 5;
这可能导致零行、一行或多行被更新。尝试一次不匹配任何行的 更新并不是错误。
让我们详细看看这条命令:首先是关键字UPDATE, 后跟表名。与通常一样,表名可以是模式限定的,否则将在路径中 查找。接下来是关键字SET,后跟列名、一个 等号和列的新值。新的列值可以是任何标量表达式,而不仅仅是 常量。例如,如果你想把所有产品的价格提高 10%,可以使用:
UPDATE products SET price = price * 1.10;
如你所见,新值的表达式也可以引用旧值。我们还省略了 WHERE子句。如果省略它,就意味着表中的 所有行都被更新。如果给出它,则只有满足WHERE 之后条件的那些行被更新。注意,SET子句中 的等号是赋值,而WHERE子句中的等号是比较, 但这不会产生任何歧义。当然,条件不必是相等测试。还有许多 其他操作符可用(见第 9 章)。但表达式 必须求值为布尔结果。
你也可以在一条UPDATE命令中更新多列,方法 是在SET子句中列出多个赋值。例如:
UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。