萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 跨表更新:用單條 SQL 替代 Python 循環

遇到「根據 B 表數據更新 A 表」的需求時,許多開發者的第一反應是寫腳本循環執行單條更新。本文通過一個真實場景,展示如何用 MySQL 原生多表 UPDATE 一行代碼解決問題,避免「大炮打蚊子」式的低效實現。

業務場景

兩張表結構如下:

表名字段類型
table_a(目標表)idint(11)
namevarchar(20)
ageint(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)

低效方案:Python 逐行更新

# 伪代码示例
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

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 交互。

為什麼這行 SQL 就夠了?

  • MySQL 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 多表更新語法簡潔、標準、高效,是每位後端工程師必須掌握的核心技能。

copyright © 萬盛學電腦網 all rights reserved