Skip to content

数据修改

使用 UPDATE 命令修改数据

在数据库操作中,我们经常需要更新已存储的数据。PostgreSQL 提供了强大的 UPDATE 命令来完成这一任务。本节将通过实例讲解如何使用 UPDATE 命令来修改表中的数据。

UPDATE 命令基础语法

基本语法

sql
UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
WHERE 条件;

如果省略 `WHERE` 子句,表中的所有行都将被更新!请务必小心使用。

实际应用案例

假设我们有一个名为 weather 的天气数据表,由于测量仪器校准问题,我们发现 1994 年 11 月 28 日之后的所有温度读数都偏高了 2 度。我们需要将这些数据进行更正。

步骤 1: 查看原始数据

首先,让我们看一下更新前的数据:

sql
SELECT * FROM weather;

原始数据可能如下:

citytemp_lotemp_hiprcpdate
San Francisco46520.251994-11-27
San Francisco435701994-11-29
Hayward3754null1994-11-29

步骤 2: 执行更新操作

现在,让我们使用 UPDATE 命令修正数据:

sql
UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > '1994-11-28';

这条命令的作用是:

  1. 选择 weather 表中所有日期晚于 1994-11-28 的记录
  2. 将这些记录的 temp_hitemp_lo 字段各减去 2 度

TIP

计算表达式注意我们可以在 SET 子句中使用表达式,如 temp_hi - 2,而不仅仅是常量值。

步骤 3: 验证更新结果

执行更新后,我们可以再次查询表格数据来验证更改:

sql
SELECT * FROM weather;

更新后的数据:

citytemp_lotemp_hiprcpdate
San Francisco46500.251994-11-27
San Francisco415501994-11-29
Hayward3552null1994-11-29

从结果可以看到,只有 11 月 28 日之后的数据被更新了,而 11 月 27 日的数据保持不变。

UPDATE 命令的高级用法

更新多个字段

如示例所示,我们可以在一个 UPDATE 语句中同时更新多个字段:

sql
UPDATE 表名
SET 列名1 = 值1,
    列名2 = 值2,
    列名3 = 值3
WHERE 条件;
sql
UPDATE employees
SET salary = salary * 1.1,
    last_updated = CURRENT_TIMESTAMP,
    status = 'active'
WHERE department = 'Sales';

使用子查询更新

我们也可以使用子查询的结果来更新表:

sql
UPDATE products
SET price = price * 1.1
WHERE category_id IN (SELECT id FROM categories WHERE name = 'Electronics');

大规模数据更新可能会导致性能问题或锁定问题。对于大型表的更新操作,考虑在低峰期执行或分批处理。

返回更新的数据

在 PostgreSQL 中,我们可以使用 RETURNING 子句来返回被更新的行:

sql
UPDATE accounts
SET balance = balance - 100.00
WHERE name = 'Alice'
RETURNING account_no, name, balance;

小结

  • UPDATE 命令用于修改表中已存在的数据
  • 使用 WHERE 子句限定要更新的行,避免不必要的全表更新
  • 可以同时更新多个字段,也可以使用表达式计算新值
  • 可以结合子查询进行更复杂的更新操作
  • RETURNING 子句可以返回已更新的数据