1. 介紹
MySQL 在許多網站應用程式與資料庫管理中被廣泛使用,資料的更新對於日常營運與應用程式維護而言極為重要。特別是面對大量資料或需要一次更新多筆記錄的系統,必須善用 MySQL 的 UPDATE 敘述以有效率地執行操作。
本文將詳細說明如何使用 MySQL 的 UPDATE 敘述批次更新多筆記錄與多個欄位。從簡單的用法到較複雜的條件更新,我們會依序介紹,讓需要在 MySQL 中執行複雜更新操作的讀者能夠快速上手。
2. UPDATE 敘述的基本語法
MySQL 的 UPDATE 敘述是依據特定條件更新資料表中資料的語法。首先,我們先看一下 UPDATE 敘述的基本語法,以及如何更新單筆記錄或單一欄位。
基本語法
MySQL UPDATE 敘述的基本語法如下。
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
- table_name:指定要更新的資料表名稱。
- SET 子句:指定要更新的欄位與新值。一次更新多個欄位時,請以逗號分隔欄位‑值配對。
- WHERE 子句:指定要更新的記錄條件。若省略條件,資料表中的所有記錄都會被更新,請特別留意。
更新單筆記錄或單一欄位的範例
以下為基本用法範例,說明如何更新單筆記錄或單一欄位。
UPDATE users
SET name = 'Tanaka'
WHERE id = 1;
此 SQL 敘述將 users 資料表中 id 為 1 的記錄的 name 欄位更新為「Tanaka」。透過指定 WHERE 子句,只會更新特定的那筆記錄。 
3. 批次更新多筆記錄
在批次更新多筆記錄時,可在 WHERE 子句中指定多個條件。例如,可使用 IN 或 OR 子句來列出多個條件,從而有效率地一次更新多筆記錄。
使用 IN 子句更新多筆記錄
利用 IN 子句可以更新符合特定值清單的記錄。
UPDATE users
SET status = 'active'
WHERE id IN (1, 3, 5, 7);
在此 SQL 敘述中,於 users 資料表內,id 為 1、3、5 或 7 的記錄,其 status 欄位皆會被更新為 ‘active’。使用 IN 子句即可批次更新符合條件的多筆記錄。
使用 OR 子句指定多個條件
OR 子句允許將多個條件組合起來指定。
UPDATE users
SET status = 'inactive'
WHERE id = 2 OR id = 4 OR id = 6;
此 SQL 敘述會將 id 為 2、4、6 的記錄的 status 欄位更新為 ‘inactive’。透過 OR 子句,可同時更新符合多個條件的記錄。
4. 同時更新多個欄位
在 MySQL 的 UPDATE 敘述中,可同時更新多個欄位。當需要一次變更多筆資訊且要保持資料一致性時,這非常實用。
更新多個欄位的範例
同時更新多個欄位時,請在 SET 子句中以逗號分隔欄位名稱與對應的值。
UPDATE products
SET price = price * 1.1, stock = stock - 1
WHERE id = 10;
此 SQL 敘述在 products 資料表中,id 為 10 的記錄,其 price 欄位提升 10%,stock 欄位則減少 1。透過在 SET 子句中指定多個欄位,可有效率地一次更新多項資訊。
5. 使用 CASE 敘述的條件更新
在 MySQL 的 UPDATE 敘述中,可使用 CASE 表達式根據不同條件設定不同的值。這讓您能彈性地依多種條件調整更新內容,使複雜的更新作業變得簡單易執行。
使用 CASE 表達式的基本語法
%%CODEBLOCK5%%
使用 CASE 表達式的 UPDATE 陳述式的基本語法如下。
UPDATE table_name
SET column_name = CASE
WHEN condition1 THEN value1
WHEN condition2 THEN value2
...
ELSE default_value
END
WHERE condition;
- 欄位名稱 : 指定您想要更新的欄位。
- 條件 : 在 WHEN 子句中指定條件,當符合時於 THEN 子句設定要套用的值。
- 預設值 : 當沒有任何條件符合時設定的值(可選)。
使用 CASE 的實務範例
以下是一個根據職位更新 employees 資料表中薪資的範例。
UPDATE employees
SET salary = CASE
WHEN position = 'Manager' THEN salary * 1.1
WHEN position = 'Developer' THEN salary * 1.05
WHEN position = 'Intern' THEN salary * 1.02
ELSE salary
END;
在此 SQL 陳述式中,employees 資料表的每筆記錄,salary 欄位會根據 position 欄位的值進行更新。
多欄位條件更新
CASE 表達式也可以套用於多個欄位。以下範例中,employees 資料表的 salary 與 bonus 欄位會根據職位與服務年資以不同的值進行更新。
UPDATE employees
SET
salary = CASE
WHEN position = 'Manager' AND years_of_service >= 5 THEN salary * 1.15
WHEN position = 'Developer' AND years_of_service >= 3 THEN salary * 1.1
ELSE salary
END,
bonus = CASE
WHEN position = 'Manager' THEN bonus + 1000
WHEN position = 'Developer' THEN bonus + 500
ELSE bonus
END;
在此 SQL 陳述式中,薪資與獎金會同時根據職位與服務年資進行條件更新。使用 CASE 表達式可實現基於多重條件的彈性更新。 
6. 使用 JOIN 更新多個資料表
在 MySQL 中,您可以使用 JOIN 子句結合多個資料表,並根據特定條件更新記錄。這讓您在更新單一資料表時,能參照其他資料表的資料,實現複雜的資料操作。
使用 JOIN 的 UPDATE 陳述式基本語法
使用 JOIN 更新多個資料表時,其基本語法如下。
UPDATE tableA
JOIN tableB ON tableA.column = tableB.column
SET tableA.updated_column = new_value
WHERE condition;
- 資料表 A 與資料表 B : 指定要更新的目標資料表(A)以及參考資料表(B)。
- ON 子句 : 指定 JOIN 條件,並定義以哪個欄位進行資料表的連接。
- SET 子句 : 指定要更新的欄位及其新值。
- WHERE 子句 : 指定更新條件,僅更新符合條件的記錄。
使用 JOIN 的實務範例
以下是一個將 orders 資料表與 customers 資料表連接,更新特定客戶相關訂單狀態的範例。
UPDATE orders
JOIN customers ON orders.customer_id = customers.id
SET orders.status = 'Shipped'
WHERE customers.vip_status = 'Yes';
在此 SQL 陳述式中,orders 資料表中,customers 資料表的 vip_status 為「Yes」的客戶所對應的訂單 status 欄位會被更新為「Shipped」。透過使用 JOIN 子句,您可以根據其他資料表的資訊進行更新。
使用多條件的 JOIN 更新
您可以結合多個條件以指定更細緻的篩選標準。以下範例中,根據條件批次變更特定客戶相關訂單的狀態。
UPDATE orders
JOIN customers ON orders.customer_id = customers.id
SET orders.status = CASE
WHEN customers.vip_status = 'Yes' THEN 'Priority'
WHEN customers.vip_status = 'No' AND orders.amount > 10000 THEN 'Review'
ELSE orders.status
END
WHERE orders.date >= '2024-01-01';
透過運用 JOIN,您可以執行彈性且依條件調整的資料更新。
7. 效能與考量
在使用 MySQL 的 UPDATE 陳述式一次大量修改多筆資料或多個欄位時,特別是面對大型資料集,必須考量效能。以下列出您應該了解的重點與注意事項,以提升更新效能並維持資料完整性。
效能最佳化技巧
善用索引
在使用 WHERE 子句依特定條件更新記錄時,為相關欄位建立索引可提升搜尋速度。索引能增強查詢效能,即使更新的資料量很大,也能有效處理。
CREATE INDEX idx_customer_id ON orders(customer_id);
然而,索引過多反而會降低效能,因此建議僅為必要的欄位建立索引。
以批次處理減輕負載
一次更新大量資料會對資料庫伺服器造成沉重負載,並拖慢回應時間。對於大規模更新,採用批次處理(將操作分多次執行)可以減輕伺服器負載。
UPDATE orders
SET status = 'Processed'
WHERE status = 'Pending'
LIMIT 1000;
結合腳本使用時,您可以不斷執行批次更新,以達到高效的資料修改。
使用交易
當多個 UPDATE 陳述式彼此相關或資料完整性相當重要時,使用交易(transaction)可確保一致性。透過交易,若更新過程中發生錯誤,所有變更都會回滾。
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
UPDATE accounts SET balance = balance + 500 WHERE id = 2;
COMMIT;
鎖定管理
執行 UPDATE 可能會產生表鎖。這在多位使用者同時存取同一資料表時尤為重要。例如,使用列級鎖(row‑level lock)可讓其他使用者同時操作不同的列,實現平行處理。避免整表鎖(full‑table lock)有助於提升資料庫的回應速度。 
8. 小結
本文詳細說明了使用 MySQL UPDATE 陳述式批次更新多筆記錄與多個欄位的有效方法,涵蓋了從基礎用法到進階技巧。當在 MySQL 中同時更新多筆資料時,必須考量資料量、處理速度與資料完整性。
重點回顧
- UPDATE 陳述式的基礎
- 了解 UPDATE 陳述式的基本語法,讓您能安全地更新單一欄位或記錄。
- 批次更新多筆記錄
- 我們示範了如何使用 WHERE、IN 與 OR 子句,針對符合特定條件的多筆記錄進行高效更新。
- 同時更新多個欄位
- 透過 SET 子句,您可以在同一筆記錄中一次更新多個欄位,達到高效且保持資料一致性的更新。
- 使用 CASE 陳述式的條件更新
- 善用 CASE 陳述式,根據不同條件在單一次操作中執行多種更新,簡化複雜的更新邏輯。
- 使用 JOIN 更新多個資料表
- 在更新特定記錄時參照其他資料表的資料,可提升整體資料庫的完整性。
- 效能與考量
- 我們說明了如何透過索引、批次處理與交易來執行高效且安全的資料更新,同時提醒您注意鎖定管理,以最佳化資料庫效能。
結論
在 MySQL 中高效地更新資料是資料庫管理工作中相當重要的技能。精通 UPDATE 陳述式不僅能提升作業效率,亦能優化整體系統效能。務必將本文所介紹的技巧應用於實務任務與專案中。


