同事往varchar(50)的备注列里塞了一段文案,直接报value too long for type character varying(50),他想把长度改大,但在生产表上不敢随便敲ALTER。

标准写法就一句ALTER

ALTER TABLE orders ALTER COLUMN remark TYPE varchar(200);

注意这里COLUMN不建议省,用的是TYPE不是MODIFY,MySQL那套在PG里不管用,写错了直接语法错。

改大和改小完全是两回事

把varchar从50改成200,PG只更新元数据,不动数据,秒完成,不锁表,随便挑时间执行。但从200改回50就不一样了,PG要先扫全表,确认现有数据都塞得下,会拿表锁,大表能把业务卡住。

想加长varchar基本无风险,想缩短就得挑低峰期,或者用分区、影子表的方式迁。

改成text有什么不同

  • varchar到text:同样只改元数据,速度一样快,text没有长度上限
  • 影响查询吗:PG里varchar和text性能没差,选哪个看约束需求
  • 要限制上限:那就留varchar并加CHECK约束,别用text裸奔
ALTER TABLE orders ALTER COLUMN remark TYPE text;

改之前该做三件事

先查当前定义,确认列名和类型有没有写错。再确认有没有依赖这列的视图、索引或触发器,有的话要一起评估。三是在从库先演练一遍,看耗时和锁情况。

SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = orders;

一句话取舍:加长随便改,缩短务必挑低峰、先演练,业务写入频繁的表,改成text是最省心的选择。