Skip to content

UPDATE 更新数据

UPDATE 语句用于修改表中的现有数据。本章将详细介绍 UPDATE 语句的各种用法。

基本语法

sql
UPDATE table_name
SET column1 = value1, column2 = value2
WHERE condition;

更新单行数据

sql
-- 更新用户年龄
UPDATE users
SET age = 26
WHERE id = 1;

更新多个列

sql
-- 同时更新多个列
UPDATE users
SET age = 26, email = 'newemail@example.com'
WHERE id = 1;

更新多行数据

sql
-- 更新所有北京的用户
UPDATE users
SET status = 'active'
WHERE city = '北京';

使用计算更新

sql
-- 所有商品价格上涨 10%
UPDATE products
SET price = price * 1.1;

-- 年龄增加 1
UPDATE users
SET age = age + 1
WHERE id = 1;

使用子查询更新

sql
-- 根据订单数量更新用户状态
UPDATE users
SET status = 'vip'
WHERE id IN (
    SELECT user_id 
    FROM orders 
    GROUP BY user_id 
    HAVING COUNT(*) > 10
);

使用 JOIN 更新

sql
-- 根据另一个表更新
UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.last_order_date = o.order_date
WHERE o.id = (
    SELECT MAX(id) FROM orders WHERE user_id = u.id
);

使用 CASE 更新

sql
-- 条件更新
UPDATE users
SET status = CASE
    WHEN age < 18 THEN '未成年'
    WHEN age < 60 THEN '成年'
    ELSE '老年'
END;

实战示例

更新用户资料

sql
UPDATE users
SET 
    name = '张三',
    email = 'zhang@example.com',
    updated_at = NOW()
WHERE id = 1;

批量状态更新

sql
-- 激活最近登录的非活跃用户
UPDATE users
SET status = 'active'
WHERE status = 'inactive'
  AND last_login > DATE_SUB(NOW(), INTERVAL 30 DAY);

常见错误

错误 1:忘记 WHERE 子句

sql
-- 危险:会更新所有行!
UPDATE users SET age = 25;

-- 正确:使用 WHERE 子句
UPDATE users SET age = 25 WHERE id = 1;

错误 2:安全更新模式

sql
-- 禁用安全更新模式(谨慎使用)
SET SQL_SAFE_UPDATES = 0;

-- 执行更新
UPDATE users SET age = 25 WHERE name = '张三';

-- 重新启用安全更新模式
SET SQL_SAFE_UPDATES = 1;

最佳实践

  1. 始终使用 WHERE 子句
  2. 先用 SELECT 测试条件
  3. 重要更新使用事务
  4. 批量更新前备份数据
  5. 添加 updated_at 时间戳

性能优化

sql
-- 为 WHERE 列创建索引
CREATE INDEX idx_status ON users(status);

-- 使用 LIMIT 分批更新
UPDATE users 
SET status = 'active' 
WHERE status = 'inactive' 
LIMIT 1000;

小结

  • UPDATE ... SET:修改数据
  • WHERE 子句:指定要更新的行
  • 多列更新:同时更新多个列
  • 计算更新:在 SET 中使用表达式
  • 子查询和 JOIN:复杂更新

下一步: 学习 DELETE 删除数据