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

mysql集合更新怎么做_mysql批量操作思路

梦瑶酱_7023

梦瑶酱_7023

发布时间:2026-03-15 15:08:03

|

1024人浏览过

|

来源于php中文网

原创

INSERT ... ON DUPLICATE KEY UPDATE 是 MySQL 批量更新首选,需确保唯一索引存在且正确使用 VALUES();大批量宜用 UPDATE JOIN 临时表;REPLACE INTO 有隐式删插风险;百万级必须分批+事务控制。

mysql集合更新怎么做_mysql批量操作思路

MySQL 用 INSERT ... ON DUPLICATE KEY UPDATE 做集合更新最稳妥

当你要根据主键或唯一索引批量更新一批记录(比如同步用户状态、刷新商品库存),INSERT ... ON DUPLICATE KEY UPDATE 是 MySQL 原生支持、原子性强、性能好的首选。它本质是“有则更新,无则插入”,但只要确保目标表的 WHERE 条件能命中唯一约束(如 id 或 UNIQUE KEY),就能当纯更新用。

常见错误是没建好唯一索引,导致语句变成批量插入而非更新;或者把 ON DUPLICATE KEY 写成 ON CONFLICT(那是 PostgreSQL 的语法)。

  • 必须提前在要匹配的字段上建 UNIQUE 或 PRIMARY KEY,否则不触发更新逻辑
  • 更新字段不能写成 SET col = VALUES(col) 就完事——VALUES(col) 指的是本次 INSERT 尝试插入的值,不是原值
  • 如果只想更新、不想插入新行,可在 INSERT 部分故意让非唯一字段违反约束(比如设一个不可能的 status = -1),但这属于 hack,不推荐
INSERT INTO user_status (id, last_login, status) 
VALUES (101, '2024-06-01 10:00:00', 1),
       (102, '2024-06-01 10:05:00', 0),
       (103, '2024-06-01 10:10:00', 1)
ON DUPLICATE KEY UPDATE 
  last_login = VALUES(last_login),
  status = VALUES(status);

大批量更新别硬扛,用 UPDATE ... JOIN + 临时表拆解

当要更新几万甚至几十万行,且条件复杂(比如按另一个表的聚合结果更新),直接写 UPDATE ... WHERE id IN (...) 容易触发锁表、超时或内存溢出。UPDATE ... JOIN 配合临时表是更可控的方式。

关键点在于:临时表必须有索引(尤其是被 JOIN 的字段),否则性能会断崖式下跌;临时表用 CREATE TEMPORARY TABLE,会话结束自动清理,比普通表安全。

MySQL
MySQL

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

下载
  • 不要在 UPDATE 中嵌套子查询返回大量数据,MySQL 5.7 及以前版本可能生成派生表并全表扫描
  • JOIN 的顺序影响执行计划——把小结果集(如临时表)放左边,大表放右边,优化器更容易走索引
  • 更新前先 SELECT 验证临时表数据是否符合预期,避免误更新
CREATE TEMPORARY TABLE tmp_update AS
SELECT user_id, MAX(login_time) as latest_login
FROM login_log 
WHERE log_date >= '2024-06-01'
GROUP BY user_id;

ALTER TABLE tmp_update ADD PRIMARY KEY (user_id);

UPDATE users u
JOIN tmp_update t ON u.id = t.user_id
SET u.last_active = t.latest_login;

REPLACE INTO 看似简单,但会隐式删再插,慎用

REPLACE INTO 在遇到唯一键冲突时,会先 DELETE 原行再 INSERT 新行。这会导致自增 ID 跳变、触发器重复执行、外键级联行为异常,还可能放大 binlog 体积。

除非你明确需要重置整行(包括未在语句中指定的字段为默认值),否则它不是 ON DUPLICATE KEY UPDATE 的替代方案,而是不同语义的操作。

  • 如果表有 AUTO_INCREMENT 主键,REPLACE 后该 ID 一定会变,下游依赖主键的缓存或日志可能失效
  • 如果行上有 ON DELETE CASCADE 的外键子表,REPLACE 会触发一次删除+插入,子表对应行被删又重建
  • 无法只更新部分字段——没出现在 REPLACE 语句里的字段会被设为默认值或 NULL

真正的大批量(百万+),考虑分批次 + LIMIT + 事务控制

无论用哪种 SQL 方式,单次更新超过 10 万行都容易触发 lock_wait_timeout、撑爆 innodb_buffer_pool 或阻塞复制。必须主动切片。

核心不是“怎么写一条牛逼 SQL”,而是“怎么让每条 SQL 都轻量、可中断、可重试”。用 LIMIT 分批是底线,配合 WHERE id > ? 游标推进比 OFFSET 更稳定。

  • 每次更新后加 SELECT ROW_COUNT() 判断是否还有数据,避免死循环
  • 每批用独立事务,失败只回滚当前批,不影响整体进度
  • 应用层控制间隔(比如 SLEEP(0.1)),减轻主库压力,也方便运维随时暂停
START TRANSACTION;
UPDATE orders 
SET status = 3 
WHERE id BETWEEN 100001 AND 101000 
  AND status = 1;
COMMIT;
MySQL 批量更新真正的难点不在语法,而在对唯一约束的依赖是否清晰、对锁范围和事务粒度是否有预判。写完语句后,务必用 EXPLAIN 看执行计划,确认走了索引;上线前在从库或测试环境压测锁等待时间。

热门AI工具

更多
Loomy
Loomy Hot

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

WorkBuddy

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

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2353

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1439

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

855

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3312

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5628

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1239

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5911

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5122

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

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

共1课时 | 191人学习

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

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