PostgreSQL UPDATE 用法与实例

在本文中,我们讨论了在 PostgreSQL 中使用 UPDATE 语句更新表中的行。

在 PostgreSQL 中,UPDATE 语句允许你更新表中的已有的数据行。

UPDATE 语法

PostgreSQL UPDATE 语句可以更新表中的一行或者多行数据,可以更新表中的一个或者多个列的值。 以下是 UPDATE 语句的基本语法:

UPDATE [IGNORE] table_name
SET
    column_name1 = value1,
    column_name2 = value2,
    ...
[WHERE clause]
[RETURNING expr];

用法说明:

  • UPDATE 关键字后指定要更新数据的表名。

  • 使用 SET 子句设置列的新值。多个列使用逗号分隔。列的值可以是普通的字面值,也可以是表达式运算,还可以是子查询。

  • 使用 WHERE 子句指定要更新的行的条件。只有符合 WHERE 条件的行才会被更新。

  • WHERE 子句是可选的。如果不指定 WHERE 子句,则更新表中的所有行。

  • RETURNING 子句是可选的。它用于返回更新的行的信息。

    expr 可以是列名或者表达式,多个列或者表达式请使用逗号分隔。 您还可以使用 * 表示表中的所有的列。

    如果不指定 RETURNING 子句, UPDATE 语句将返回更新的行数。

UPDATE 语句中的 WHERE 子句非常重要。除非您特意,否则不要省略 WHERE 子句。

PostgreSQL UPDATE 实例

下面我们将通过几个实例来展示 UPDATE 的具体用法。

我们将使用 Sakila 示例数据库 中的表进行演示,请您先在 PostgreSQL 中安装 Sakila 示例数据库

在以下实例中,customer 表中存储了客户的信息。

使用 UPDATE 修改单列值

在这个例子中,我们将把 customer_id 等于 1 的客户的电子邮件修改为 [email protected]

  1. 使用以下 SELECT 语句查看更新前的数据。

    SELECT first_name, last_name, email
    FROM customer
    WHERE customer_id = 1;
    
     first_name | last_name |             email
    ------------+-----------+-------------------------------
     MARY       | SMITH     | [email protected]
  2. 使用以下 UPDATE 语句更新 email 列的值。

    UPDATE customer
    SET email = '[email protected]'
    WHERE customer_id = 1;
    
    UPDATE 1

    在此 UPDATE 语句中:

    • 通过 WHERE 子句指定更新的条件为 customer_id = 1
    • 通过 SET 子句将 email 列的值设置为新电子邮件。

    UPDATE 返回了 UPDATE 1,它表示更新了一行。

  3. 或者,您可以使用以下 RETURNING 子句直接查看更新后的数据:

    UPDATE customer
    SET email = '[email protected]'
    WHERE customer_id = 1
    RETURNING first_name, last_name, email;
    
     first_name | last_name |               email
    ------------+-----------+-----------------------------------
     MARY       | SMITH     | [email protected]

使用 UPDATE 修改多列值

在这个例子中,我们将同时更新 customer_id 等于 1 的客户的 first_name, last_name, email 列。

UPDATE customer
SET first_name = 'Tim',
    last_name = 'Duncan',
    email = '[email protected]'
WHERE customer_id = 1
RETURNING first_name, last_name, email;
 first_name | last_name |             email
------------+-----------+-------------------------------
 Tim        | Duncan    | [email protected]

使用表达式更新

使用 UPDATE 更新时,列的值可以设置为表达式的运算结果,比如函数或其他的运算。

下面的 UPDATE 更新所有客户的电子邮件的域名部分:

UPDATE customer
SET email = REPLACE(email, 'sakilacustomer.org', 'sjkjc.com')
RETURNING first_name, last_name, email;
 first_name  |  last_name   |              email
-------------+--------------+---------------------------------
 PATRICIA    | JOHNSON      | [email protected]
 LINDA       | WILLIAMS     | [email protected]
 BARBARA     | JONES        | [email protected]
 ELIZABETH   | BROWN        | [email protected]
 JENNIFER    | DAVIS        | [email protected]
 MARIA       | MILLER       | [email protected]
 SUSAN       | WILSON       | [email protected]
 MARGARET    | MOORE        | [email protected]
 DOROTHY     | TAYLOR       | [email protected]
 LISA        | ANDERSON     | [email protected]
...
(599 rows)

注意,本例中没有使用 WHERE 子句,所以表中所有的数据都进行了更新。

使用子查询更新

下面实例展示了如何为没有绑定商店的客户绑定一个随机商店。

UPDATE customer
SET store_id = (
    SELECT store_id
    FROM store
    ORDER BY random()
    LIMIT 1
  )
WHERE store_id IS NULL;

在本例中,我们通过以下 SELECT 语句返回一个随机的商店 id:

SELECT store_id
FROM store
ORDER BY random()
LIMIT 1

SET 子句中,将 store_id 的值设置为上面的子查询的结果。

结论

PostgreSQL UPDATE 语句用来更新一个表中的一个或者多个已有的行。如果带有 RETURNING 子句, UPDATE 语句将返回更新后的行,否则它将返回被更新的行数。