pg修改字段长度不锁表方法

尼克

尼克

2026-06-14

400人浏览

原创

postgresql 扩大 varchar 长度仅修改元数据、不锁表,但需防 accessexclusivelock 等待;收缩或跨类型变更必重写表,应清理数据、分步操作或用 pgroll 在线迁移。

pg修改字段长度不锁表方法

扩大 VARCHAR 长度本身就不锁表,但得防等锁

直接结论:ALTER TABLE t ALTER COLUMN c TYPE VARCHAR(500) 这类扩大操作,PostgreSQL 只改 pg_attribute.atttypmod 元数据,不重写数据页,毫秒级完成。真正卡住你的不是 DDL 本身,而是它在等一个 AccessExclusiveLock —— 如果此时表上有未提交的长事务、函数索引正在重建、或 CHECK 约束在扫描全表,ALTER 就会排队挂起,后续所有读写请求全被堵住。

必须加保护:

  • SET lock_timeout = '3s'; 再执行 ALTER,超时自动失败,业务不受影响
  • 执行前先查阻塞源:SELECT blocked.pid, blocking.pid, blocking.query FROM pg_stat_activity blocked JOIN pg_stat_activity blocking ON blocking.pid = ANY(pg_blocking_pids(blocked.pid)) WHERE blocked.wait_event_type = 'Lock';
  • 避开高峰期;大表操作前确认无活跃长事务(SELECT pid, now() - xact_start, state, query FROM pg_stat_activity WHERE state = 'active' AND now() - xact_start > '5min'::interval;

视图依赖时不能直接 ALTER,但别急着改 pg_attribute

报错 cannot alter type of a column used by a view or rule 是常见拦截。此时有两种路:

  • 安全做法:临时 DROP VIEW v1; ALTER TABLE ... ; CREATE VIEW v1 AS ...,需确保视图定义可复原且逻辑无歧义
  • 高危捷径:用超级用户直改 pg_attribute.atttypmod(例如从 VARCHAR(50)VARCHAR(200),则设 atttypmod = 204),但必须提前备份:SELECT * INTO pg_attribute_backup FROM pg_attribute;;一旦写错,可能造成查询截断甚至崩溃,且无法回滚

注意:atttypmod 值 = 实际长度 + 4(PostgreSQL 内部 varchar 头部开销),算错就白改。

Bandy AI
Bandy AI

全球领先的电商设计Agent

下载

收缩长度或跨类型改字段,躲不开重写表

VARCHAR(200) → VARCHAR(50)TEXT → VARCHAR(100) 这类操作必然触发全表重写,锁表时间与数据量正相关。没有“不锁表”方案,只有降低影响的策略:

  • 收缩前必须清理:UPDATE t SET c = LEFT(c, 50) WHERE LENGTH(c) > 50;DELETE 超长行,否则 ALTER 直接报错
  • TEXT 转 VARCHAR 推荐分两步:ALTER TABLE t ALTER COLUMN c TYPE VARCHAR(100) USING substring(c FROM 1 FOR 100);USING 子句不可省,否则低版本报错
  • 对上亿行大表,考虑用 pgroll 工具做在线迁移(需额外部署),或手动建新表 + 触发器同步 + 原子切换

最稳的大表扩长方案:TEXT + CHECK 约束

当你要给一个十亿行表的 description 字段从 VARCHAR(255) 扩到 500,又不敢赌 ALTER 的毫秒响应,可用这个组合拳:

  • ALTER TABLE t ALTER COLUMN description TYPE TEXT;(毫秒,不重写)
  • ALTER TABLE t ADD CONSTRAINT chk_desc_len CHECK (char_length(description) (跳过存量数据校验)
  • 低峰期运行:ALTER TABLE t VALIDATE CONSTRAINT chk_desc_len;(只校验新增/修改行,存量数据不扫)

这个方案不依赖超级用户权限,不碰系统表,也不要求停业务——但要注意,NOT VALID 约束对 INSERT/UPDATE 仍生效,只是不追溯历史数据。

真正容易被忽略的是:扩大长度虽快,但字段变长后,如果后续加了函数索引(比如 lower(name)),下次改这个索引时可能触发全表重扫;还有,USING 子句在跨类型转换时必须显式写出,漏掉就会在旧版本直接失败。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

pg修改字段长度

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.10

190

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

1884

19

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。更详细的postgresql常用命令,大家可以访问下面的文章。

2023.11.16

482

3

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有\l、\d、\d5、\di、\ds、\dv、\df、\dn、\db、\dg、\dp、\c、\pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

2023.11.20

1049

6

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2026.02.12

336

19

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

2026.05.08

66

10

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

2026.05.08

799

10

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

2026.05.08

140

10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

1254

3

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习