PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

5.7. 修改表结构 #

5.7.1. 添加列
5.7.2. 删除列
5.7.3. 添加约束
5.7.4. 删除约束
5.7.5. 更改列的默认值
5.7.6. 更改列的数据类型
5.7.7. 重命名列
5.7.8. 重命名表

当数据表创建并投入生产运行后,业务演进可能需要对其物理模式进行调整。PostgreSQL 提供了强大的 ALTER TABLE 系列命令,允许在无需卸载重建表的前提下动态修改既有表结构。

5.7.1. 添加列 #

要添加新列,使用如下命令:

ALTER TABLE products ADD COLUMN description text;

新列初始会被全表填充为其默认值(若未指定默认值则填充为 NULL)。

5.7.2. 删除列 #

要移除既有列,执行:

ALTER TABLE products DROP COLUMN description;

表中该列的数据在逻辑上将被立即移除。如果该列被其他视图或外键约束依赖,需要添加 CASCADE 级联清除。

5.7.3. 添加约束 #

要为现有表附加新约束,使用表级约束语法格式:

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 异步完成历史数据校验。

5.7.4. 删除约束 #

删除约束需要指定具体的约束名称:

ALTER TABLE products DROP CONSTRAINT some_name;

对于非空约束,使用:

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;

5.7.5. 更改列的默认值 #

设置或修改字段默认值:

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;

修改默认值仅影响后续新插入的行,不会追溯修改既有历史行。移除默认值使用:

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

5.7.6. 更改列的数据类型 #

要将字段转换为另一种兼容类型:

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);

若两类型间不存在直接的隐式转换,可通过附加 USING 子句自定义行级转换表达式:

ALTER TABLE products ALTER COLUMN price TYPE integer USING round(price)::integer;

5.7.7. 重命名列 #

重命名列:

ALTER TABLE products RENAME COLUMN product_no TO product_number;

5.7.8. 重命名表 #

重命名整张数据表:

ALTER TABLE products RENAME TO items;