在这里您将学习如何更新 PostgreSQL 数据库中表中的数据。

在 PostgreSQL 中,使用 UPDATE 语句修改表中的现有数据。 UPDATE语句只更新表中的数据,并不修改表的结构。

UPDATE <table_name>
SET <column1> = <value1>,
    <column2> = <value2>,
    ...
WHERE <condition>
RETURNING * | <output_expression> AS <output_name>; 

在上面的语法中:

  • 在 UPDATE 关键字后指定要更新数据的表的名称。
  • 在 SET 关键字之后,指定列及其新值的一种或多种组合。 SET 子句中未指定的列将具有其原始值。
  • WHERE 子句是可选的,它限制特定于指定条件的更新操作。如果不指定 WHERE 子句,Postgres 将更新表的所有行。
  • RETURNING 子句是可选的,它将返回指定列的所有更新行或值的列表。
  • 让我们更新以下 employee 表中的数据。

    更新单行

    将 WHERE 子句与 UPDATE 语句结合使用并指定主键值以更新表中的单行。

    例如,以下 UPDATE 语句将更新其 emp_id=1employee 的电子邮件。

    UPDATE employee
    SET email = '[email protected]'
    WHERE emp_id = 1; 

    在上面的示例中,UPDATE employee 表示我们要更新 employee 表中的数据,SET email = '[email protected]' 指定电子邮件列应更新为 '[email protected]'WHERE emp_id = 1 将更新 emp_id 值为 1 的行,从而将更新操作限制为仅限一行。

    UPDATE 语句返回UPDATE 1,表示它已更新 1 行。

    让我们使用下面所示的 SELECT 查询来验证更新的数据。

    PostgreSQL 更新数据

    注意:如果您不指定WHERE子句,那么它将更新所有行中的电子邮件列值。

    UPDATE employee
    SET email = '[email protected]'; 

    带有 UPDATE 语句的 RETURNING 子句

    RETURNING 子句返回更新的行或列值。如果您指定RETURNING *,那么它将返回所有更新的行,如果您指定RETURNING column_name,那么它将返回指定列的值。您可以指定用逗号分隔的多个列。

    以下 UPDATE 语句返回所有更新的行:

    UPDATE employee
    SET birthdate = NULL,
        salary = 10000,
        last_name = 'Blamire'
    WHERE emp_id = 4
    RETURNING *; 

    如您所见,birthdate 设置为 NULL,salary 设置为 10000,last_name 更改为 "Blamire",其中 emp_id = 4。 对于 SET 子句,列的顺序并不重要。

    RETURNING 子句可与一列或多列一起使用。以下 UPDATE 语句返回多列:

    UPDATE employee
    SET last_name = 'Blamire',
    	birthdate = NULL,
    	salary = 10000
    WHERE emp_id = 4
    RETURNING first_name, last_name, salary; 

    RETURNING 子句可以使用表的任何列,不一定是 SET 子句中使用的列,例如first_name 列未更新,但我们仍然可以使用 RETURNING 子句获取它。

    连接更新

    PostgreSQL 支持使用 UPDATE 连接子句根据另一表中的值更新一个表中的数据。

    UPDATE <table_1>
    SET <column1> = <value1>
    FROM <table_2>
    WHERE <join_conditions_table_1_table_2>; 

    在上面的语法中,要在 UPDATE 语句中连接另一个表,请为第二个表指定 FROM 子句,并在 WHERE 子句中提供连接条件。 FROM 子句必须位于 SET 子句之后。

    对于 table_1 的每一行,UPDATE 语句都会与 table_2 的行连接。对于所有匹配的行,UPDATE 语句会使用 <value1> 中指定的新值更新 column1 的值。

    考虑我们有部门(父表)和员工(子表)

    现在我们想要将 IT 部门中以 dept_name 为"IT"的所有员工的工资增加到现有工资的 10%,我们可以通过遵循 UPDATE join 语句来实现。

    UPDATE Employee emp
    SET SALARY = SALARY + (SALARY * 0.10)
    FROM Department dept
    WHERE emp.dept_id = dept.dept_id
    AND dept.dept_name = 'IT'; 

    当执行上面的 UPDATE 语句时,它显示更新了 2 行。对于 Employee 表的每一行,它使用 dept_id 作为匹配列,使用部门名称作为 IT 来连接 Department 表,并将这些员工的工资增加 10%。

    让我们从 Employee 表中选择数据并验证工资的更新方式。请注意,有两名 emp_id 为 3 和 6 的员工属于 IT 部门,dept_id 为 2。