PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

6.2. 更新数据 #

修改数据库中既有的存量数据被称为更新。你可以更新单条特定行、更新表中的全量行,或更新满足特定条件的子集行。各字段列可以单独独立更新,未声明的其余字段完全不受影响。

修改既有数据使用 UPDATE 命令。该命令主要包含三部分信息:

  1. 需要更新的目标表名及字段列名

  2. 列所赋予的新数据值或计算表达式

  3. 哪些数据行需要被更新(过滤条件)

回顾 Chapter 5 中的介绍,SQL 默认不会为数据行自动分配全局唯一的物理标识。因此通常不能像操作数组下标那样直接按物理编号定位行,而是必须指定数据行必须满足的布尔匹配条件。只有当表中建立了主键时,你才能通过指定主键的等值条件绝对精准地定位并锁定单行记录。图形化数据库管理工具也是基于这一原理实现逐行修改功能的。

例如,将价格为 5 的所有商品价格统一调整为 10:

UPDATE products SET price = 10 WHERE price = 5;

根据当前表中的实际数据分布,这可能会更新零行、一行或多行。执行一条未能匹配到任何既有数据行的更新语句在语法和系统机制上是完全合法的,不会触发报错。

分析该命令的结构细节:首先是关键字 UPDATE 后接目标表名。接着是关键字 SET,后跟目标列名、等号,以及该列的新数据值。赋予的新值不仅限于字面常量,还可以是任何动态标量表达式。例如将全表商品价格上调 10%:

UPDATE products SET price = price * 1.10;

如你所见,计算新值的表达式可以直接引用该行本身的既有旧值。在该语句中我们省略了 WHERE 条件,这意味着全表中的所有数据行都将被批量更新。若显式声明了 WHERE,则仅有令条件为真(True)的行才会被修改。请注意,SET 内部的等号属于赋值操作,而 WHERE 内部的等号属于比较运算,两者在解析器中界定清晰毫无歧义。WHERE 条件不仅限于等值测试,可以使用丰富的各类比较运算符(参见 Chapter 9),只要该表达式最终能返回布尔结果即可。

通过在 SET 子句中平铺书写多个由逗号分隔的赋值子句,可以在单次 UPDATE 中同时修改多个字段:

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