UPDATE
更新表中已有数据,支持条件更新、多表 JOIN 更新和限制更新行数
语法
UPDATE table SET column1=value1 [, column2=value2 ...] [WHERE conditions] [ORDER BY ...] [LIMIT count];
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
SET |
指定要更新的列和值 | UPDATE users SET status = 0 WHERE id = 100; |
常用 |
WHERE |
更新条件(必须加!) | UPDATE orders SET status = 2 WHERE order_no = 'ORD20260001'; |
常用 |
LIMIT |
限制更新行数 | UPDATE orders SET status = -1 WHERE status = 0 LIMIT 100; |
进阶 |
JOIN |
多表关联更新 | UPDATE orders o JOIN users u ON o.user_id = u.id SET o.status = -1 WHERE u.status = 0; |
进阶 |
CASE WHEN |
条件赋值 | UPDATE products SET price = CASE WHEN stock > 100 THEN price * 0.9 ELSE price END; |
进阶 |
示例
基本更新
UPDATE users
SET email = 'newemail@example.com',
updated_at = NOW()
WHERE id = 1001;务必加 WHERE 条件,否则更新全表
批量状态更新
UPDATE orders
SET status = -1,
updated_at = NOW()
WHERE status = 0
AND created_at < DATE_SUB(NOW(), INTERVAL 30 MINUTE);将 30 分钟未付款的订单标记为超时取消
JOIN 更新
UPDATE products p JOIN categories c ON p.category_id = c.id SET p.status = 0 WHERE c.name = '下架分类';
根据关联表条件批量更新
安全更新(先查后改)
-- 先确认影响范围 SELECT COUNT(*) FROM orders WHERE status = 0 AND created_at < '2026-01-01'; -- 确认后再更新 UPDATE orders SET status = -1 WHERE status = 0 AND created_at < '2026-01-01';
生产环境先 SELECT 确认影响行数
常见错误
ERROR 1175: You are using safe update mode (SET sql_safe_updates=1)
安全模式下 UPDATE 必须带 WHERE 且条件包含索引列。临时关闭:SET sql_safe_updates = 0;
ERROR 1062 (23000): Duplicate entry for key
更新后的值违反唯一约束,检查目标值是否已存在
技巧
- 生产环境永远不要执行没有 WHERE 的 UPDATE
- 大批量更新分批执行,避免长时间锁表:UPDATE ... LIMIT 1000 配合循环
- 开启 sql_safe_updates 防止误操作全表更新