> 技术文档 > MySQL 中的 UPDATE 语句_update set

MySQL 中的 UPDATE 语句_update set


MySQL 中的 UPDATE 语句

UPDATE 语句用于修改表中的数据,可以更新单行或多行数据。


1. UPDATE 语法

UPDATE 表名SET1 =1,2 =2, ...WHERE 条件;

⚠ 注意

  • 必须加 WHERE,否则会修改所有行
  • SET 后可同时更新多个字段
  • WHERE 用于筛选需要更新的记录

2. 基本 UPDATE 示例

(1) 更新单个字段

UPDATE usersSET age = 30WHERE id = 1;

解释

  • id = 1age 更新为 30

(2) 更新多个字段

UPDATE usersSET age = 30, city = \'Shanghai\'WHERE id = 1;

解释

  • id = 1age 改为 30city 改为 \'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\' 的用户的 age25


(2) 使用 ANDOR

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;

更新 age30-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 > 50platinum
  • age 在 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 ... JOIN 关联更新 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 限制更新行数 UPDATE users SET status = \'inactive\' ORDER BY id ASC LIMIT 10; UPDATE ... REPLACE 替换字段内容 UPDATE users SET email = REPLACE(email, \'gmail.com\', \'yahoo.com\');

🚀 重点

  1. 一定要加 WHERE,避免误更新所有数据!
  2. 批量更新大表时,分批更新 (LIMIT),避免锁表。
  3. CASE 进行条件更新,提高灵活性。
  4. 涉及多个表时,用 JOIN 更新数据。
  5. 大规模更新前,先 SELECT 预览结果。

这样,你的 UPDATE 语句就能又快又安全!💡