当数据表创建并投入生产运行后,业务演进可能需要对其物理模式进行调整。PostgreSQL 提供了强大的 ALTER TABLE 系列命令,允许在无需卸载重建表的前提下动态修改既有表结构。
要添加新列,使用如下命令:
ALTER TABLE products ADD COLUMN description text;
新列初始会被全表填充为其默认值(若未指定默认值则填充为 NULL)。
要移除既有列,执行:
ALTER TABLE products DROP COLUMN description;
表中该列的数据在逻辑上将被立即移除。如果该列被其他视图或外键约束依赖,需要添加 CASCADE 级联清除。
要为现有表附加新约束,使用表级约束语法格式:
ALTER TABLE products ADD CHECK (name <> ''); ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no); ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
如果要添加非空约束,语法稍有不同:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
添加约束时系统会立即扫描整表数据进行合法性验证。对于海量数据大表,支持添加 NOT VALID 选项跳过历史全表扫描,仅对后续新写入数据生效,之后在业务低峰期通过 VALIDATE CONSTRAINT 异步完成历史数据校验。
删除约束需要指定具体的约束名称:
ALTER TABLE products DROP CONSTRAINT some_name;
对于非空约束,使用:
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
设置或修改字段默认值:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
修改默认值仅影响后续新插入的行,不会追溯修改既有历史行。移除默认值使用:
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
要将字段转换为另一种兼容类型:
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
若两类型间不存在直接的隐式转换,可通过附加 USING 子句自定义行级转换表达式:
ALTER TABLE products ALTER COLUMN price TYPE integer USING round(price)::integer;