MySQL 中的 UPDATE 語句詳解
MySQL 中的 UPDATE 語句
UPDATE 語句用于修改表中的數(shù)據(jù),可以更新單行或多行數(shù)據(jù)。
1. UPDATE 語法
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... WHERE 條件;
? 注意:
- 必須加
WHERE,否則會修改所有行。SET后可同時更新多個字段。WHERE用于篩選需要更新的記錄。
2. 基本 UPDATE
示例
(1) 更新單個字段
UPDATE users SET age = 30 WHERE id = 1;
解釋:
將 id = 1 的 age 更新為 30。
(2) 更新多個字段
UPDATE users SET age = 30, city = 'Shanghai' WHERE id = 1;
解釋:
id = 1 的 age 改為 30,city 改為 'Shanghai'。
(3) 更新所有行(小心使用!)
UPDATE users SET status = 'inactive';
? 危險:
- 沒有
WHERE,會更新整個表! status字段的所有數(shù)據(jù)都變成'inactive'。
如何防止誤操作?
先用 SELECT 檢查更新范圍
:
SELECT * FROM users WHERE status = 'active';
開啟事務(wù)(如果支持)
:
START TRANSACTION; UPDATE users SET status = 'inactive'; ROLLBACK; -- 取消 COMMIT; -- 確認(rèn)更新
3. UPDATE 結(jié)合 WHERE 條件
(1) 使用 = 精確匹配
UPDATE users SET age = 25 WHERE name = 'Alice';
更新 name = 'Alice' 的用戶的 age 為 25。
(2) 使用 AND 和 OR
UPDATE users SET status = 'inactive' WHERE age > 30 AND city = 'Beijing';
更新 age > 30 且 city = 'Beijing' 的用戶。
UPDATE users SET status = 'inactive' WHERE age > 50 OR city = 'Shanghai';
更新 age > 50 或 city = 'Shanghai' 的用戶。
(3) 使用 IN
UPDATE users SET vip_status = 'gold' WHERE id IN (1, 2, 3, 5);
更新 id 在 (1,2,3,5) 里的用戶。
(4) 使用 BETWEEN
UPDATE users SET level = 'senior' WHERE age BETWEEN 30 AND 40;
更新 age 在 30-40 之間的用戶。
(5) 使用 LIKE
UPDATE users SET department = 'Tech' WHERE email LIKE '%@gmail.com';
更新所有 email 以 @gmail.com 結(jié)尾的用戶。
4. UPDATE 結(jié)合 JOIN
批量更新數(shù)據(jù),通過 JOIN 關(guān)聯(lián)兩個表:
UPDATE users u JOIN orders o ON u.id = o.user_id SET u.vip_status = 'gold' WHERE o.total_amount > 1000;
解釋:
users表和orders表通過user_id關(guān)聯(lián)。- 當(dāng)用戶的
total_amount > 1000時,更新users.vip_status為'gold'。
5. UPDATE 結(jié)合 CASE(條件更新)
UPDATE users
SET vip_status =
CASE
WHEN age > 50 THEN 'platinum'
WHEN age BETWEEN 30 AND 50 THEN 'gold'
ELSE 'silver'
END;解釋:
age > 50→platinumage 在 30-50之間 →gold- 其他情況 →
silver
6. UPDATE 結(jié)合 LIMIT
如果一次只想修改 部分?jǐn)?shù)據(jù):
UPDATE users SET status = 'inactive' ORDER BY id ASC LIMIT 10;
解釋:
- 只更新 前 10 行 數(shù)據(jù)(按
id升序排序)。 - 適用于大表分批更新。
7. UPDATE 結(jié)合 ORDER BY
更新時,按特定順序處理數(shù)據(jù):
UPDATE users SET rank = rank + 1 ORDER BY age DESC;
解釋:
按 age 從大到小更新 rank。
8. UPDATE 批量替換字段
(1) 替換部分字符串
UPDATE users SET email = REPLACE(email, 'gmail.com', 'yahoo.com') WHERE email LIKE '%gmail.com';
解釋:
將 email 里的 gmail.com 替換為 yahoo.com。
(2) 拼接字符串
UPDATE users SET username = CONCAT(username, '_new');
解釋:
在 username 末尾加 _new。
9. UPDATE 事務(wù)控制
如果 UPDATE 可能影響多行數(shù)據(jù),建議使用事務(wù):
START TRANSACTION; UPDATE users SET balance = balance - 100 WHERE id = 1; UPDATE users SET balance = balance + 100 WHERE id = 2; COMMIT;
如果失敗,可回滾:
ROLLBACK;
10. 防止 UPDATE 影響整個表
為了防止忘記 WHERE 語句,可以開啟 safe updates:
SET SQL_SAFE_UPDATES = 1;
如果更新時沒加 WHERE,會報錯:
ERROR 1175 (HY000): You are using safe update mode...
關(guān)閉(僅當(dāng)必要時):
SET SQL_SAFE_UPDATES = 0;
總結(jié)
| 用法 | 說明 | 示例 |
|---|---|---|
| 更新單列 | 修改一個字段 | UPDATE users SET age = 30 WHERE id = 1; |
| 更新多列 | 同時修改多個字段 | UPDATE users SET age = 30, city = 'Shanghai' WHERE id = 1; |
| 批量更新 | 更新多個匹配行 | UPDATE users SET status = 'inactive' WHERE age > 30; |
UPDATE ... JOIN | 關(guān)聯(lián)更新 | UPDATE users u JOIN orders o ON u.id = o.user_id SET u.vip_status = 'gold' WHERE o.total_amount > 1000; |
UPDATE ... CASE | 條件更新 | UPDATE users SET vip_status = CASE WHEN age > 50 THEN 'platinum' ELSE 'silver' END; |
UPDATE ... LIMIT | 限制更新行數(shù) | UPDATE users SET status = 'inactive' ORDER BY id ASC LIMIT 10; |
UPDATE ... REPLACE | 替換字段內(nèi)容 | UPDATE users SET email = REPLACE(email, 'gmail.com', 'yahoo.com'); |
?? 重點:
- 一定要加
WHERE,避免誤更新所有數(shù)據(jù)! - 批量更新大表時,分批更新 (
LIMIT),避免鎖表。 - 用
CASE進行條件更新,提高靈活性。 - 涉及多個表時,用
JOIN更新數(shù)據(jù)。 - 大規(guī)模更新前,先
SELECT預(yù)覽結(jié)果。
這樣,你的 UPDATE 語句就能又快又安全!??
到此這篇關(guān)于MySQL 中的 UPDATE 語句的文章就介紹到這了,更多相關(guān)mysql update語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談MySQL數(shù)據(jù)庫中日期中包含零值的問題
下面小編就為大家?guī)硪黄獪\談MySQL數(shù)據(jù)庫中日期中包含零值的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
在?CentOS?7?下如何使用?Ansible?Playbook?實現(xiàn)?MySQL?8.0.34?的
要在?CentOS?7?下使用?Ansible?Playbook?實現(xiàn)?MySQL?8.0.34?的二進制安裝,需要先下載?MySQL?8.0.34?的二進制包,并將其上傳至目標(biāo)服務(wù)器,對MySQL?8.0.34?二進制安裝過程感興趣的朋友跟隨小編一起看看吧2024-03-03
MySQL入門(三) 數(shù)據(jù)庫表的查詢操作【重要】
本節(jié)比較重要,對數(shù)據(jù)表數(shù)據(jù)進行查詢操作,其中可能大家不熟悉的就對于INNER JOIN(內(nèi)連接)、LEFT JOIN(左連接)、RIGHT JOIN(右連接)等一些復(fù)雜查詢。 通過本節(jié)的學(xué)習(xí),可以讓你知道這些基本的復(fù)雜查詢是怎么實現(xiàn)的,,需要的朋友可以參考下2018-07-07
詳細聊一聊mysql的樹形結(jié)構(gòu)存儲以及查詢
由于mysql是關(guān)系型數(shù)據(jù)庫,因此對于類似組織架構(gòu),子任務(wù)等相關(guān)的樹形結(jié)構(gòu)的處理不是很友好,下面這篇文章主要給大家介紹了關(guān)于mysql樹形結(jié)構(gòu)存儲以及查詢的相關(guān)資料,需要的朋友可以參考下2022-04-04
MySQL報錯Failed to open the referenced&nbs
在數(shù)據(jù)庫操作中,嘗試刪除外鍵約束表'master_role'時遇到錯誤碼3730,因其被'user_role'表中的外鍵'fk_user_role'引用,解決方法包括關(guān)閉外鍵檢查和刪除外鍵,阿里巴巴開發(fā)手冊和知乎回答指出,外鍵雖能維護數(shù)據(jù)一致性2024-11-11
MySQL內(nèi)存使用率高且不釋放問題排查與總結(jié)
這篇文章主要給大家介紹了MySQL內(nèi)存使用率高且不釋放問題排查與總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細,對大家解決問題有一定的幫助,需要的朋友可以參考下2024-09-09

