MySQL 的 `UPDATE` 語句用于修改表中已有的記錄,是數據庫操作中最核心的命令之一。它非常強大,但使用不當(尤其是忘記指定條件時)會導致災難性后果。
以下是 `UPDATE` 語句的詳細指南,從基礎到進階。
UPDATE [LOW_PRIORITY] [IGNORE] table_name
SET column1 = value1, column2 = value2, ...
* **`UPDATE table_name`**: 指定要更新數據的表。
* **`SET`**: 指定要修改的列和它們的新值。
* **`WHERE`**: **極其重要!** 指定哪些記錄需要更新。如果省略,將更新表中的**所有記錄**。
* **`ORDER BY`**: 通常與 `LIMIT` 一起使用,按特定順序更新記錄。
* **`LIMIT`**: 限制被更新的記錄數量。
| id | username | email | age | score | status |
| :--- | :--- | :--- | :--- | :--- | :--- |
SET email = 'bob@new.com'
**注意**:`WHERE username = 'bob'` 確保了只有 `bob` 的記錄被更新。
將用戶 `charlie` 的狀態改為 `active` 并給他加 10 分。
SET status = 'active', score = score + 10
WHERE id = 3; -- 使用主鍵ID作為條件通常更精確
**警告**:這個查詢**沒有** `WHERE` 子句,它將更新整個表!請謹慎使用。
根據不同條件將不同的值更新到字段中。例如,根據分數等級設置不同的狀態。
WHEN score >= 90 THEN 'excellent'
WHEN score >= 80 THEN 'good'
2. 使用 `ORDER BY` 和 `LIMIT`
限制更新的行數或按順序更新。例如,給最老的 5 個用戶加 20 分。
ORDER BY id ASC -- 假設id越小代表用戶越老
3. 多表連接更新 (UPDATE with JOIN)
這是非常強大的功能,可以根據另一個表的值來更新當前表。
假設我們有一個 `orders` 表,需要根據訂單狀態來更新 `users` 表的 `status`。
SELECT user_id, COUNT(*) AS order_count
WHERE o.order_count > 10;
這個語句將“已將超過10個訂單發貨的用戶”更新為VIP狀態。
另一個常見的例子,用一個表的數據直接更新另一個表:
UPDATE target_table t, source_table s
SET t.column_to_update = s.source_column
WHERE t.matching_id = s.matching_id;
四、 關鍵子句:`LOW_PRIORITY` 和 `IGNORE`
`LOW_PRIORITY`**: 如果有其他客戶端正在讀取該表,則延遲 `UPDATE` 的執行,直到沒有讀取操作。適用于可以延遲執行的批量更新。
UPDATE LOW_PRIORITY users SET ... WHERE ...;
* **`IGNORE`**: 如果更新過程中出現錯誤(如重復鍵沖突),語句不會中止,而是將錯誤轉為警告并繼續執行。
UPDATE IGNORE users SET ... WHERE ...;
1. **永遠先寫 `WHERE`,再寫 `SET`**
這是一個防止災難的心理習慣。先確定條件,再決定要改什么。
2. **先 `SELECT`,后 `UPDATE`**
在執行一個不確定的 `UPDATE` 之前,先用 `SELECT` 語句和相同的 `WHERE` 條件驗證目標數據是否正確。
SELECT * FROM users WHERE status = 'inactive';
UPDATE users SET score = 0 WHERE status = 'inactive';
對于重要的更新操作,最好在事務中執行。這樣如果出錯,可以回滾(`ROLLBACK`)到更新前的狀態。
START TRANSACTION; -- 開始事務
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- ROLLBACK; -- 如果有錯誤,回滾,所有更改取消
在生產環境中,應該嚴格管理數據庫用戶的權限,避免普通應用賬號擁有過高的 `UPDATE` 權限。
另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導出導入。可本地連接LINUX里的MYSQL,簡單便捷?梢源蟠蟮靥岣吖ぷ餍枢。