讲师中心 微信公众号
AI工具推荐 视频效率加速

mysql如何只更新表中的部分数据_使用update配合where子句

夏宇吖_5822

夏宇吖_5822

发布时间:2026-03-27 09:30:02

|

164人浏览过

|

来源于php中文网

原创

UPDATE语句必须带WHERE,否则会全表覆写;建议先用SELECT验证条件、开启SQL_SAFE_UPDATES、确保WHERE字段有合适索引、避免在WHERE中对字段使用函数。

mysql如何只更新表中的部分数据_使用update配合where子句

UPDATE 语句必须带 WHERE,否则全表覆写

不加 WHERE 的 UPDATE 是高危操作,MySQL 不会警告,直接修改所有行。线上误执行 UPDATE users SET status = 0; 这种语句,可能瞬间让全部用户被禁用。

实操建议:

  • 执行前先用 SELECT 验证条件:比如要更新 status = 1 的用户,先跑 SELECT id, name FROM users WHERE status = 1 LIMIT 5;
  • 开发环境养成习惯:在 MySQL 客户端里开启安全模式(SET SQL_SAFE_UPDATES = 1;),这样没带 WHERE 或 WHERE 不含主键/索引字段时会报错 Error Code: 1175
  • 涉及大表更新时,避免 WHERE 条件走全表扫描——检查执行计划:EXPLAIN UPDATE ...(注意 MySQL 8.0.19+ 才支持对 UPDATE 直接 EXPLAIN,低版本用等价 SELECT 替代)

WHERE 条件字段没索引,更新慢还锁表

例如 UPDATE orders SET paid = 1 WHERE created_at > '2024-01-01' AND user_id = 123;,如果 created_at 没索引,MySQL 可能扫完整个分区甚至全表,期间持有行锁或间隙锁,阻塞其他读写。

实操建议:

  • 用 SHOW INDEX FROM orders; 确认 WHERE 中的字段是否有有效索引;复合条件优先建联合索引,顺序按「等值匹配 → 最左前缀 → 范围查询」排,比如上面例子更适合 (user_id, created_at)
  • 时间范围更新慎用函数:写成 WHERE DATE(created_at) = '2024-01-01' 会让索引失效,应改用 WHERE created_at >= '2024-01-01 00:00:00' AND created_at
  • 大表批量更新别一次性干完:拆成按主键分段,比如 WHERE id BETWEEN 10000 AND 19999 AND status = 0,每次更新 1 万行,降低锁等待和 binlog 压力

UPDATE 多字段时,SET 子句顺序无关,但 NULL 处理要小心

SET 后字段顺序不影响结果,但若某字段设为 NULL,而该列定义是 NOT NULL 且无默认值,就会报错 Error Code: 1048;更隐蔽的是,某些字段类型(如 TIMESTAMP)在设为 NULL 时可能被自动转成当前时间,行为取决于 explicit_defaults_for_timestamp 配置。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

实操建议:

  • 更新前查表结构:SHOW CREATE TABLE users;,确认字段是否允许 NULL、有无默认值、是否自增
  • 避免隐式类型转换:比如 SET score = '95'(字符串)更新 INT 字段,虽能成功但触发隐式转换,影响性能;统一用对应类型字面量
  • 想保留原值就别写进 SET:不要写 SET name = name, email = 'a@b.com',冗余且可能因并发导致意外覆盖

WHERE 条件里用子查询,性能差还可能报错

比如 UPDATE logs SET processed = 1 WHERE id IN (SELECT id FROM temp_queue WHERE batch = '202405');,MySQL 5.6+ 会将子查询转成关联,但若 temp_queue 没索引或数据量大,仍可能慢;更麻烦的是,MySQL 不允许在子查询中直接引用被更新的表,会报 Error Code: 1093。

实操建议:

  • 把子查询结果先落临时表:CREATE TEMPORARY TABLE tmp_ids AS SELECT id FROM temp_queue WHERE batch = '202405';,再 UPDATE logs JOIN tmp_ids ON logs.id = tmp_ids.id SET processed = 1;
  • 确认子查询返回的字段类型和主表匹配:比如 logs.id 是 BIGINT,但子查询返回的是 VARCHAR,会导致索引失效
  • 线上禁用未加 LIMIT 的子查询更新,防止内存爆掉——IN 子查询结果集过大时,优化器可能放弃使用索引

真正难的不是语法,是判断 WHERE 条件到底命中多少行、锁哪些索引、会不会拖垮从库同步。上线前拿慢日志和 SHOW PROCESSLIST 对着看,比背一百遍语法管用。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4143

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

891

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1069

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6041

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2923

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6000

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8041

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1090

2024.04.29

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

0

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn