假設有兩張表:product(產品信息,含價格欄位 price)和 productPrice(產品價格表)。需求是將 productPrice 表中的價格更新為 product 表價格的 80%。
UPDATE product p, productPrice pp
SET pp.price = pp.price * 0.8
WHERE p.productId = pp.productId
AND p.dateCreated < '2004-01-01';
UPDATE product p
INNER JOIN productPrice pp
ON p.productId = pp.productId
SET pp.price = pp.price * 0.8
WHERE p.dateCreated < '2004-01-01';
語義明確,易於閱讀與維護,生產環境首選。
若 productPrice 中無對應價格記錄,則將 product 表的 isDeleted 標記為 1:
UPDATE product p
LEFT JOIN productPrice pp
ON p.productId = pp.productId
SET p.deleted = 1
WHERE pp.productId IS NULL;
跨表更新不限於單表,可同時修改多表字段:
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';
此例同時更新了 productPrice.price 和 product.dateUpdate 兩個字段。
MySQL 跨表 UPDATE 支援隱式連接、INNER JOIN、LEFT JOIN 等多種語法,且能在單條語句中更新多張表。建議使用顯式 JOIN 語法,邏輯更清晰。配合上一篇《MySQL 跨表 DELETE》可全面掌握多表寫操作。