遇到「根據 B 表數據更新 A 表」的需求時,許多開發者的第一反應是寫腳本循環執行單條更新。本文通過一個真實場景,展示如何用 MySQL 原生多表 UPDATE 一行代碼解決問題,避免「大炮打蚊子」式的低效實現。
兩張表結構如下:
| 表名 | 字段 | 類型 |
|---|---|---|
| table_a(目標表) | id | int(11) |
| name | varchar(20) | |
| age | int(11) |
初始數據:
table_a: (1,'name1',0), (2,'name2',0), (3,'name3',0), (4,'name4',0), (5,'name5',0)
table_b: (1,11), (2,21), (3,31), (4,41), (5,51)
# 伪代码示例
rs = db.query("SELECT id, age FROM table_b")
for row in rs:
idv, age = row
db.update(f"UPDATE table_a SET age={age} WHERE id={idv}")
缺點顯而易見:N 次網絡往返、N 次解析優化、N 次事務提交,性能隨數據量線性下降。
UPDATE table_a a, table_b b
SET a.age = b.age
WHERE a.id = b.id;
執行後 table_a.age 直接變為 11, 21, 31, 41, 51,全程僅一次 SQL 交互。
UPDATE 支援 table_references 列出多張表WHERE 子句指定關聯條件,等同於 INNER JOIN 邏輯若源表需先聚合或過濾:
UPDATE table_a a
JOIN (
SELECT user_id, AVG(score) AS avg_score
FROM table_b
WHERE created_at > '2024-01-01'
GROUP BY user_id
) b ON a.id = b.user_id
SET a.avg_score = b.avg_score;
能用單條 SQL 解決的問題,絕不寫循環。MySQL 多表更新語法簡潔、標準、高效,是每位後端工程師必須掌握的核心技能。