首页/数据/SQL 速查/按主键分批更新大表
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条变更与事务52 条
性能与执行计划72 条

按主键分批更新大表

大范围 UPDATE 会长时间持锁、生成大事务:按主键区间循环小批执行,控制锁与回滚规模。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
-- 按主键区间小批推进
UPDATE orders SET status = 'archived'
WHERE status = 'done' AND id BETWEEN 1 AND 10000;
-- 循环推进 id 区间直到处理完成

-- 单表可用 ORDER BY + LIMIT
UPDATE orders SET status = 'archived'
WHERE status = 'done'
ORDER BY id
LIMIT 1000;

PostgreSQL

PostgreSQL
-- 借 ctid 分批(每批重新定位)
UPDATE orders SET status = 'archived'
WHERE ctid IN (
  SELECT ctid FROM orders WHERE status = 'done' LIMIT 1000
);
要点每批独立提交;批间可加入短暂停降低持续压力
索引WHERE 里带能走索引的条件(主键或状态索引)
断点脚本记录进度,中断后从上次位置继续

易错点

  • 一条 UPDATE 跑全表:长事务、锁等待与复制延迟一起放大,失败回滚也久
  • PG 用 ctid 分批时忽略并发变更:元组位置可能变化,分批脚本要容忍少量重复扫描

数据来源与参考

  • MySQL 8.0 Reference Manual · UPDATE
  • PostgreSQL Documentation · UPDATE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌