批次更新 MySQL 記錄與欄位 – 從入門到精通

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 資料表的 salarybonus 欄位會根據職位與服務年資以不同的值進行更新。

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 中同時更新多筆資料時,必須考量資料量、處理速度與資料完整性。

重點回顧

  1. UPDATE 陳述式的基礎
  • 了解 UPDATE 陳述式的基本語法,讓您能安全地更新單一欄位或記錄。
  1. 批次更新多筆記錄
  • 我們示範了如何使用 WHERE、IN 與 OR 子句,針對符合特定條件的多筆記錄進行高效更新。
  1. 同時更新多個欄位
  • 透過 SET 子句,您可以在同一筆記錄中一次更新多個欄位,達到高效且保持資料一致性的更新。
  1. 使用 CASE 陳述式的條件更新
  • 善用 CASE 陳述式,根據不同條件在單一次操作中執行多種更新,簡化複雜的更新邏輯。
  1. 使用 JOIN 更新多個資料表
  • 在更新特定記錄時參照其他資料表的資料,可提升整體資料庫的完整性。
  1. 效能與考量
  • 我們說明了如何透過索引、批次處理與交易來執行高效且安全的資料更新,同時提醒您注意鎖定管理,以最佳化資料庫效能。

結論

在 MySQL 中高效地更新資料是資料庫管理工作中相當重要的技能。精通 UPDATE 陳述式不僅能提升作業效率,亦能優化整體系統效能。務必將本文所介紹的技巧應用於實務任務與專案中。