SQL 操作数据:更新数据 UPDATE

前面介绍了如何向数据表中插入数据,插完数据后,根据业务需要,我们会对某些数据进行修改,如修改状态等。此时,你可以使用 UPDATE 语句修改数据库表中已存在的记录,本文将结合 user 用户表,详细讲解 UPDATE 语句的使用方法、语法规则。

UPDATE 基本语法

UPDATE 语句的核心语法结构如下:

UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
[WHERE 条件];

详细说明:

  • UPDATE 表名:指定要更新数据的表,本文以 user 表为例。

  • SET 列名 = 值:指定要修改的列和对应的新值,多列更新用逗号分隔。

  • WHERE 条件:可选,指定更新的行范围,省略 WHERE 会更新表中所有行(请谨慎操作)。

 

案例实践(基于 user 表)

以下所有案例均基于教程前面提供的 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 的数。


说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号