首页/数据/SQL 速查/分批更新:UPDATE ORDER BY LIMIT 与 ctid 方案
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

分批更新:UPDATE ORDER BY LIMIT 与 ctid 方案

大表更新采用分批提交:MySQL 支持 UPDATE ... ORDER BY ... LIMIT;PostgreSQL 没有 LIMIT,用 ctid/主键子查询分包。

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

MySQL

MySQL
UPDATE orders
SET synced = 1
WHERE synced = 0
ORDER BY id
LIMIT 1000;

PostgreSQL

PostgreSQL
WITH batch AS (
    SELECT ctid FROM orders
    WHERE synced = false
    ORDER BY id
    LIMIT 1000
)
UPDATE orders o
SET synced = true
FROM batch b
WHERE o.ctid = b.ctid;
MySQL单表 UPDATE 可带 ORDER BY + LIMIT;每批一个短事务
PostgreSQL无 LIMIT;用主键范围或 ctid 子查询切片
节奏每批之间可加短暂 sleep,给复制与清理留出余量

易错点

  • 分批更新的 WHERE 条件必须能收敛(如 synced=0),条件写法不当会永远循环处理同一批
  • ctid 在行被更新后会变化(PG 的物理行标识),复杂并发写入场景用主键切片更稳

数据来源与参考

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