前面介绍了如何向数据表中插入数据,插完数据后,根据业务需要,我们会对某些数据进行修改,如修改状态等。此时,你可以使用 UPDATE 语句修改数据库表中已存在的记录,本文将结合 user 用户表,详细讲解 UPDATE 语句的使用方法、语法规则。
UPDATE 语句的核心语法结构如下:
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2, ... [WHERE 条件];
详细说明:
UPDATE 表名:指定要更新数据的表,本文以 user 表为例。
SET 列名 = 值:指定要修改的列和对应的新值,多列更新用逗号分隔。
WHERE 条件:可选,指定更新的行范围,省略 WHERE 会更新表中所有行(请谨慎操作)。
以下所有案例均基于教程前面提供的 user 表结构,覆盖日常开发中常见的更新场景。
将 user_id 为 1 的用户姓名修改为 “张三”,例如:
-- 查询 user_id 为 1 的用户信息 > SELECT * FROM `user` WHERE `user_id` = 1 user_id|name|gender|age|phone |email |address |create_time |update_time | -------+----+------+---+-----------+--------------------+------------+-------------------+-------------------+ 1|张三 |男 | 25|13800138000|zhangsan@example.com|北京市朝阳区建国路88号|2025-01-18 02:03:00|2025-12-31 03:18:07| 1 row(s) fetched. -- 修改用户名为 “张三-UPDATE” > UPDATE `user` SET `name` = '张三-UPDATE' WHERE `user_id` = 1 1 row(s) modified. -- 查看修改结果 > SELECT * FROM `user` WHERE `user_id` = 1 user_id|name |gender|age|phone |email |address |create_time |update_time | -------+---------+------+---+-----------+--------------------+------------+-------------------+-------------------+ 1|张三-UPDATE|男 | 25|13800138000|zhangsan@example.com|北京市朝阳区建国路88号|2025-01-18 02:03:00|2026-01-05 07:01:50| 1 row(s) fetched.
注意,user_id 是主键,通过主键更新能精准定位单条记录,是最安全的更新方式。表名 user 是 MySQL 关键字,需用反引号 ` 包裹避免语法错误。
将所有性别为 “未知” 且年龄为空的用户,性别统一改为 “男”。例如:
-- 查询性别为 “未知”,且年龄为空的用户信息,有三条记录 > SELECT * FROM `user` WHERE `gender` = '未知' AND `age` IS NULL user_id|name |gender|age|phone|email|address|create_time |update_time | -------+-----+------+---+-----+-----+-------+-------------------+-------------------+ 15|TEST5|未知 | | | | |2026-01-05 05:58:39|2026-01-05 05:58:39| 16|TEST6|未知 | | | | |2026-01-05 06:00:16|2026-01-05 06:00:16| 17|TEST7|未知 | | | | |2026-01-05 06:02:30|2026-01-05 06:02:30| 3 row(s) fetched. -- 更新记录 > UPDATE `user` SET `gender` = '男' WHERE `gender` = '未知' AND `age` IS NULL 3 row(s) modified.
注意,上面的 UPDATE SQL 语句使用 AND 组合多条件筛选更新范围,NULL 值需用 IS NULL 判断(不能用 =)。
将 user_id 为 2 的用户,更新手机号为 “13800138099”、邮箱为 “zhangsan99@example.com”、地址为 “北京市朝阳区99号”,例如:
> UPDATE `user` SET `phone` = '13800138099', `email` = 'zhangsan99@example.com', `address` = '北京市朝阳区99号' WHERE `user_id` = 2 1 row(s) modified.
注意,在 UPDATE 语句中修改多字段时,SET 后用逗号分隔 “列名 = 值”,最后一个字段后无需逗号。
将所有年龄小于 25 岁的用户,年龄统一加 1。例如:
> UPDATE `user` SET `age` = `age` + 1 WHERE `age` < 25 AND `age` IS NOT NULL 6 row(s) modified.
注意:更新值可基于字段自身计算,但需先筛选 age 非空避免 NULL + 1 结果仍为 NULL。
(1)避免全表更新:务必加 WHERE 条件(除非明确需要更新所有行),误操作全表更新可能导致数据灾难。
(2)唯一性约束校验:user 表中 phone 和 email 是唯一索引,更新时需确保新值不与其他记录重复,否则会报错:
1062 - Duplicate entry '13800138000' for key 'phone'
(3)事务保护:重要更新操作建议加事务,更新后验证结果,错误可回滚:
-- 开启事务 BEGIN; -- 更新数据 UPDATE `user` SET `phone` = '13900139000' WHERE `user_id` = 3; -- 验证更新结果 SELECT * FROM `user` WHERE `user_id` = 3; -- 确认无误提交事务(错误则执行 ROLLBACK; 回滚) COMMIT;
(4)字段类型匹配:更新值需符合字段类型,如 age 是 tinyint unsigned(无符号 tinyint),不能赋值负数或超过 255 的数。