MySQL 支持在 UPDATE 中直接使用 JOIN,語法清晰、性能優於子查詢:
UPDATE table1 t1
INNER JOIN table2 t2 ON t1.join_col = t2.join_col
SET t1.target_col = t2.source_col
WHERE t1.filter_col = 'value';
UPDATE CMS_Document A
INNER JOIN CMS_Template B ON A.TemplateID = B.TemplateID
SET A.RuleType2 = B.RuleType;
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';
UPDATE contact c
INNER JOIN contactdroit cd ON c.contact_id = cd.contact_id
SET c.user_name = '$username',
c.nom = '$lastname',
c.prenom = '$firstname',
c.passcode = '$password',
cd.droit_id = '$droitid'
WHERE c.contact_id = '$id';
子查詢更新需確保返回單行,且常需處理無匹配行導致的 NULL:
-- 子查詢寫法(性能較差)
UPDATE tab1
SET tab1.商品尺寸 = (
SELECT tab2.商品尺寸
FROM tab2
WHERE tab2.商品顏色 = tab1.商品顏色
)
WHERE tab1.商品顏色 IN (SELECT 商品顏色 FROM tab2);
-- 使用 NVL/COALESCE 設置默認值(Oracle/PostgreSQL/SQL Server 語法)
-- MySQL 使用 COALESCE() 或 IFNULL()
UPDATE customers a
SET city_name = COALESCE((
SELECT b.city_name
FROM tmp_cust_city b
WHERE b.customer_id = a.customer_id
), '未知');
PHP 中使用預處理:
$sql = "UPDATE product p
INNER JOIN productPrice pp ON p.productId = pp.productId
SET pp.price = pp.price * ?, p.dateUpdate = CURDATE()
WHERE p.dateCreated < ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([0.8, '2004-01-01']);