首页/数据/SQL 速查/ALTER TABLE 的锁与执行方式
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

ALTER TABLE 的锁与执行方式

结构变更的锁代价差异很大:MySQL 支持 INSTANT/INPLACE 减少锁表,PostgreSQL 多数操作会持有 ACCESS EXCLUSIVE。

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

MySQL

MySQL
ALTER TABLE orders
  ADD COLUMN memo VARCHAR(255) NULL,
  ALGORITHM=INPLACE, LOCK=NONE;   -- 指定算法失败会直接报错,适合上线前验证

PostgreSQL

PostgreSQL
ALTER TABLE orders ADD COLUMN memo text;                     -- 加可空列:元数据操作
ALTER TABLE orders ADD COLUMN cnt int NOT NULL DEFAULT 0;    -- PG 11+ 常量默认值也是元数据操作
ALTER TABLE orders ALTER COLUMN amount TYPE numeric(14,2);   -- 通常重写整表
MySQLALGORITHM=INSTANT/INPLACE/COPY;LOCK=NONE 避免阻塞读写(不支持则报错)
PostgreSQL加列/改默认多为元数据操作;改类型/加约束常需要全表扫描或重写
窗口大表变更先做影子表/在线工具评估,再选低峰执行

易错点

  • 未经评估在业务高峰执行 ALTER:锁等待会排队拖慢整库,先 SET lock_timeout 并在低峰执行
  • MySQL 未指定 ALGORITHM 时会自动选择(可能 COPY 拷表),显式指定能在测试阶段暴露风险

数据来源与参考

  • MySQL 8.0 Reference Manual · ALTER TABLE
  • PostgreSQL Documentation · ALTER TABLE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌