MySQL 中的 UPDATE 语句_update set
MySQL 中的 UPDATE 语句
UPDATE 语句用于修改表中的数据,可以更新单行或多行数据。
1. UPDATE 语法
UPDATE 表名SET 列1 = 值1, 列2 = 值2, ...WHERE 条件;
⚠ 注意:
2. 基本 UPDATE 示例
(1) 更新单个字段
UPDATE usersSET age = 30WHERE id = 1;
解释:
- 将 
id = 1的age更新为30。 
(2) 更新多个字段
UPDATE usersSET age = 30, city = \'Shanghai\'WHERE id = 1;
解释:
id = 1的age改为30,city改为\'Shanghai\'。
(3) 更新所有行(小心使用!)
UPDATE users SET status = \'inactive\';
⚠ 危险:
- 没有 
WHERE,会更新整个表! status字段的所有数据都变成\'inactive\'。
如何防止误操作?
- 
先用
SELECT检查更新范围:
SELECT * FROM users WHERE status = \'active\'; - 
开启事务(如果支持)
:
START TRANSACTION;UPDATE users SET status = \'inactive\';ROLLBACK; -- 取消COMMIT; -- 确认更新 
3. UPDATE 结合 WHERE 条件
(1) 使用 = 精确匹配
UPDATE users SET age = 25 WHERE name = \'Alice\';
更新 name = \'Alice\' 的用户的 age 为 25。
(2) 使用 AND 和 OR
UPDATE usersSET status = \'inactive\'WHERE age > 30 AND city = \'Beijing\';
更新 age > 30 且 city = \'Beijing\' 的用户。
UPDATE usersSET status = \'inactive\'WHERE age > 50 OR city = \'Shanghai\';
更新 age > 50 或 city = \'Shanghai\' 的用户。
(3) 使用 IN
UPDATE usersSET vip_status = \'gold\'WHERE id IN (1, 2, 3, 5);
更新 id 在 (1,2,3,5) 里的用户。
(4) 使用 BETWEEN
UPDATE usersSET level = \'senior\'WHERE age BETWEEN 30 AND 40;
更新 age 在 30-40 之间的用户。
(5) 使用 LIKE
UPDATE usersSET department = \'Tech\'WHERE email LIKE \'%@gmail.com\';
更新所有 email 以 @gmail.com 结尾的用户。
4. UPDATE 结合 JOIN
批量更新数据,通过 JOIN 关联两个表:
UPDATE users uJOIN orders o ON u.id = o.user_idSET u.vip_status = \'gold\'WHERE o.total_amount > 1000;
解释:
users表和orders表通过user_id关联。- 当用户的 
total_amount > 1000时,更新users.vip_status为\'gold\'。 
5. UPDATE 结合 CASE(条件更新)
UPDATE usersSET 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 结合 LIMIT
如果一次只想修改 部分数据:
UPDATE users SET status = \'inactive\' ORDER BY id ASC LIMIT 10;
解释:
- 只更新 前 10 行 数据(按 
id升序排序)。 - 适用于大表分批更新。
 
7. UPDATE 结合 ORDER BY
更新时,按特定顺序处理数据:
UPDATE users SET rank = rank + 1 ORDER BY age DESC;
解释:
- 按 
age从大到小更新rank。 
8. UPDATE 批量替换字段
(1) 替换部分字符串
UPDATE usersSET email = REPLACE(email, \'gmail.com\', \'yahoo.com\')WHERE email LIKE \'%gmail.com\';
解释:
- 将 
email里的gmail.com替换为yahoo.com。 
(2) 拼接字符串
UPDATE usersSET username = CONCAT(username, \'_new\');
解释:
- 在 
username末尾加_new。 
9. UPDATE 事务控制
如果 UPDATE 可能影响多行数据,建议使用事务:
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...
关闭(仅当必要时):
SET SQL_SAFE_UPDATES = 0;
总结
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 ... JOINUPDATE users u JOIN orders o ON u.id = o.user_id SET u.vip_status = \'gold\' WHERE o.total_amount > 1000;UPDATE ... CASEUPDATE users SET vip_status = CASE WHEN age > 50 THEN \'platinum\' ELSE \'silver\' END;UPDATE ... LIMITUPDATE users SET status = \'inactive\' ORDER BY id ASC LIMIT 10;UPDATE ... REPLACEUPDATE users SET email = REPLACE(email, \'gmail.com\', \'yahoo.com\');🚀 重点:
- 一定要加 
WHERE,避免误更新所有数据! - 批量更新大表时,分批更新 (
LIMIT),避免锁表。 - 用 
CASE进行条件更新,提高灵活性。 - 涉及多个表时,用 
JOIN更新数据。 - 大规模更新前,先 
SELECT预览结果。 
这样,你的 UPDATE 语句就能又快又安全!💡


