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 更新后的值违反唯一约束,检查目标值是否已存在

技巧

相关命令