2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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

6.2. 更新数据 #

数据库中已存在的数据的修改称为更新。您可以更新单个行、表中的所有行或所有行的一个子集。每一列都可以单独更新;其他列不受影响。

要更新现有行,请使用 UPDATE 命令。这需要三个信息

  1. 要更新的表名和列名

  2. 列的新值

  3. 要更新的行(s)

回想一下 第 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 子句中的等号是比较,但这不会造成任何歧义。当然,WHERE 条件不必是等号测试。还有许多其他运算符可用(请参阅 第 9 章)。但表达式需要求值为布尔结果。

您可以通过在 SET 子句中列出多个赋值来在 UPDATE 命令中更新多个列。例如

UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;

提交更正

如果您在文档中看到任何不正确的内容、与您在该功能上的实际经验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。