0Pricing
SQL Academy · 课时

使用 FROM 的 UPDATE 与连接式更新

使用 UPDATE ... FROM(PostgreSQL)根据另一张表中的值更新行,并使用标准 MERGE 语句。

使用 FROM 的 UPDATE 与连接式更新 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

基本 UPDATE

更改匹配行中的值:

UPDATE users SET full_name = 'Alice Adams' WHERE id = 1;

多个列

使用逗号分隔的 SET 列表:

UPDATE users
SET full_name = 'Alice', last_login = NOW(), visits = visits + 1
WHERE id = 1;

更新多行

只需通过 WHERE 匹配更多行:

UPDATE orders SET status = 'archived'
WHERE created_at < NOW() - INTERVAL '5 years';

使用子查询的 UPDATE

通过另一个查询计算新值:

UPDATE products
SET review_count = (
  SELECT COUNT(*) FROM reviews WHERE reviews.product_id = products.id
);

UPDATE … FROM(PostgreSQL)

类似 JOIN 的更新——从另一个表提取值:

UPDATE products p
SET stock = i.qty
FROM inventory i
WHERE i.product_id = p.id;

包含多个表的 UPDATE … FROM

FROM 列表可以包含多个表:

UPDATE invoices inv
SET tax_rate = r.rate
FROM users u
JOIN rates r ON r.country = u.country
WHERE inv.user_id = u.id;

标准 SQL:通过相关子查询实现 UPDATE … FROM

可移植的等价写法(速度较慢):

UPDATE products p
SET stock = (SELECT qty FROM inventory i WHERE i.product_id = p.id);

用于 INSERT/UPDATE/DELETE 的 MERGE

PostgreSQL 15+ 支持使用 MERGE 执行组合操作——请参阅 UPSERT 课程。

从 UPDATE 返回数据

一次往返即可返回已更新的行:

UPDATE orders SET status = 'shipped', shipped_at = NOW()
WHERE id = $1
RETURNING id, status, shipped_at;

使用 CASE 更新

有条件的新值:

UPDATE orders
SET status = CASE
  WHEN paid_at IS NOT NULL THEN 'paid'
  WHEN created_at < NOW() - INTERVAL '24h' THEN 'expired'
  ELSE status
END;

谨防遗漏 WHERE

UPDATE users SET active = false; 会更新 EVERY 行。在生产环境中:

  • 先运行 SELECT 以确认行数
  • 放入事务中,并在 COMMIT 前进行检查
  • 使用 BEGIN; ...; SELECT count(*) FROM users WHERE active = false; ROLLBACK; 执行试运行

UPDATE 性能

UPDATE 会创建新的行版本,并将旧版本标记为已删除(MVCC)。频繁更新的表可能会膨胀——这将在 VACUUM/MVCC 课程中介绍。

回顾

UPDATE … FROM 是一种类似 JOIN 的更新方式,可以整洁地完成批量修复。

  • 始终使用 WHERE——绝不要忘记
  • 使用 RETURNING 进行验证
  • 在事务中使用 ROLLBACK 进行测试

快速检查

哪种 UPDATE 语法可以让您在 PostgreSQL 中引用另一个表?

常见问题解答

「使用 FROM 的 UPDATE 与连接式更新」课时是免费的吗?

是的 — 「使用 FROM 的 UPDATE 与连接式更新」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「使用 FROM 的 UPDATE 与连接式更新」这节课中我会学到什么?

使用 UPDATE ... FROM(PostgreSQL)根据另一张表中的值更新行,并使用标准 MERGE 语句。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 FROM 的 UPDATE 与连接式更新」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用多行 INSERT
  2. UPSERT:ON CONFLICT DO UPDATE(PostgreSQL)
  3. 使用 FROM 的 UPDATE 与连接式更新
  4. 使用 USING 的 DELETE 与安全模式
← 返回 SQL Academy