在 PostgreSQL 中,UPDATE
语句的 FROM
子句允许你指定一个或多个表,这些表可以在更新操作中被引用。通常,你会在 FROM
子句后面使用 JOIN
来指定如何将这些表与正在更新的表连接起来。然而,PostgreSQL 允许你在 FROM
子句中指定表而不需要连接谓词,这种情况下,PostgreSQL 会将指定的表视为一个独立的源,而不是与正在更新的表进行连接的表。
UPDATE
语句可以使用 FROM
子句来指定一个或多个表,这些表可以在 SET
子句中被引用。PostgreSQL 不抛出错误的原因在于,它提供了一种灵活的方式来处理更新操作。当 FROM
子句中没有给出连接谓词时,PostgreSQL 会将 FROM
子句中的表视为一个独立的源,而不是与正在更新的表进行连接的表。这意味着,FROM
子句中的表不会被用来过滤正在更新的表的行,而是作为一个独立的源来提供值。
FROM
子句替代子查询,使查询更加直观。假设我们有两个表 employees
和 salaries
,我们想要更新 employees
表中的 salary
字段,使用 salaries
表中的值:
UPDATE employees
SET salary = salaries.salary
FROM salaries
WHERE employees.id = salaries.employee_id;
在这个例子中,FROM
子句中的 salaries
表通过 WHERE
子句与 employees
表进行了连接。如果我们省略了 WHERE
子句:
UPDATE employees
SET salary = salaries.salary
FROM salaries;
PostgreSQL 不会抛出错误,但是这个查询的行为可能不是预期的,因为它会将 salaries
表中的每一行的 salary
值应用到 employees
表的每一行上。
如果你遇到了问题,比如更新操作没有按预期进行,可能是因为 FROM
子句中的表没有正确地与正在更新的表连接。解决这个问题的方法是确保 FROM
子句中的表通过连接谓词正确地与正在更新的表连接起来。
例如,如果你想要确保只有当 employees
表中的 id
与 salaries
表中的 employee_id
匹配时才进行更新,你应该使用 WHERE
子句来指定这个条件:
UPDATE employees
SET salary = salaries.salary
FROM salaries
WHERE employees.id = salaries.employee_id;
这样,只有当两个表中的相应行匹配时,更新操作才会执行。
总之,PostgreSQL 的这种设计提供了灵活性,但同时也要求开发者注意确保 FROM
子句中的表正确地与正在更新的表连接,以避免意外的更新结果。
领取专属 10元无门槛券
手把手带您无忧上云