UPDATE table_name
SET column_name1 = new_value1, column_name2 = new_value2, ...
WHERE condition;
SET 子句指定要修改的欄位與新值,多欄位用逗號分隔。WHERE 為可選,省略時會更新全表所有行,極度危險!MySQL> USE tpsc;
MySQL> UPDATE tpsc SET tpmc = 'aaa' WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Rows matched 符合條件行數,Changed 實際值改變行數(若新值等於舊值則不計入)。
UPDATE t1
JOIN t2 ON t1.id = t2.t1_id
SET t1.status = 'processed', t2.updated_at = NOW()
WHERE t1.created_at < '2023-01-01';
UPDATE products
SET price = (SELECT AVG(price) FROM products WHERE category_id = products.category_id)
WHERE price IS NULL;
LIMIT 或主鍵範圍。pt-archiver 或自寫腳本分塊更新,減少鎖持有時間。| 錯誤 | 後果 | 修正 |
|---|---|---|
| 漏寫 WHERE | 全表資料被覆蓋 | 養成「先 SELECT 驗證條件」習慣 |
| 字串未加引號 | 語法錯誤或隱式轉換導致全表掃描 | 嚴格使用單引號包裹字串常量 |
| 更新大欄位(BLOB/TEXT) | 產生大量 Undo Log、Redo Log | 拆分到獨立表、或僅更新必要欄位 |
重要更新務必包裹在事務中:
START TRANSACTION;
UPDATE ... WHERE ...;
UPDATE ... WHERE ...;
COMMIT; -- 或 ROLLBACK;
配合 ROW_COUNT() 檢查影響行數,決定提交或回滾。