在这里您将学习如何更新 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=1
的employee
的电子邮件。
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 查询来验证更新的数据。
注意:如果您不指定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。