萬盛學電腦網

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

MySQL 多表 UPDATE 實戰模式:JOIN 更新、子查詢賦值與條件同步

模式一:內連接同步欄位

UPDATE Track
INNER JOIN MV ON Track.trkid = MV.mvid
SET Track.is_show = MV.is_show
WHERE Track.trkid < 6;

等價舊式寫法:

UPDATE Track, MV
SET Track.is_show = MV.is_show
WHERE Track.trkid = MV.mvid AND Track.trkid < 6;

模式二:子查詢賦值(單值標量)

UPDATE tab1
SET tab1.size = (
  SELECT tab2.size FROM tab2
  WHERE tab2.color = tab1.color
)
WHERE tab1.color IN (SELECT color FROM tab2);

⚠️ 子查詢**必須返回單行單列**,否則報錯 Subquery returns more than 1 row。

模式三:別名 + NVL/COALESCE 容錯賦值

UPDATE customers a
SET city_name = COALESCE((
  SELECT b.city_name FROM tmp_cust_city b
  WHERE b.customer_id = a.customer_id
), a.city_name);  -- 找不到保留原值

或指定預設值:COALESCE((subquery), '未知')。

模式四:多表多欄位同步更新

UPDATE contact c, contactdroit cd
SET c.user_name = '$username',
    c.nom = '$lastname',
    c.prenom = '$firstname',
    c.passcode = '$password',
    cd.droit_id = '$droitid'
WHERE c.contact_id = '$id'
  AND c.contact_id = cd.contact_id;

模式五:帶條件的價格批量調整

UPDATE product p
INNER JOIN productPrice pp ON p.productId = pp.productId
SET pp.price = pp.price * 0.8,
    p.dateUpdate = CURDATE()
WHERE p.dateCreated < '2004-01-01';

效能與安全建議

  1. **被更新表的連接欄位必須有索引**,否則全表掃描鎖表風險極高。
  2. 大批量更新**分批次**(每批 1000~5000 行),配合 LIMIT 或主鍵範圍,避免長事務、Binlog 膨脹、主從延遲。
  3. 生產環境**先跑 SELECT 驗證影響行數**,確認無誤再執行 UPDATE。
  4. 關鍵業務建議**啟用 Binlog Row 格式**(binlog_format=ROW),確保主從數據一致。
copyright © 萬盛學電腦網 all rights reserved