↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 6.4 已结束支持。 请参阅 当前版本手册.

ALTER TABLE

ALTER TABLE — 修改表属性

大纲

ALTER TABLE table
    [ * ] ADD [ COLUMN ] column type
ALTER TABLE table
    [ * ] RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
    RENAME TO newtable

Inputs

table

要更改的现有表的名称。

column

新列或现有列的名称。

type

新列的类型。

newcolumn

现有列的新名称。

newtable

现有列的新名称。

Outputs

→ ALTER

列或表重命名后返回的消息。

→ NEW

添加列后返回的消息。

→ ERROR

表或列不可用时返回的消息。

Description

ALTER TABLE 更改一个现有表的定义。新列及其类型的指定风格和限制与 CREATE TABLE 中相同。RENAME 子句更改表或列的名称而不更改受影响表中包含的任何数据。因此,该命令执行后,表或列仍保持相同的类型和大小。

要更改表的模式,你必须拥有该表。

Notes

关键字 COLUMN 只是噪声,可以省略。

“[*]” 跟在表名之后表示该语句应作用于该表以及继承层次中位于其下的所有表。PostgreSQL 用户指南中还有关于继承的更多信息。

有关有效参数的进一步说明,请参见 CREATE TABLE。

Usage

要添加类型为 VARCHAR 的列到表中:

    ALTER TABLE distributors ADD COLUMN address VARCHAR(30);

要重命名一个现有列:

    ALTER TABLE distributors RENAME COLUMN address TO city;

要重命名一个现有的表:

    ALTER TABLE distributors RENAME TO suppliers;

Compatibility

SQL92

ALTER TABLE/RENAME 是 Postgres 的语言扩展。

SQL92 为 ALTER TABLE 语句规定了一些 Postgres 尚不直接支持的附加能力:

ALTER TABLE table ALTER [ COLUMN ] column
    SET DEFAULT default

ALTER TABLE table ALTER [ COLUMN ] column
    ADD [ CONSTRAINT constraint ] table-constraint

把指定的默认值或约束放入表中该列的定义。默认值和表约束子句的语法见 CREATE TABLE。如果默认值子句已存在,它将被新定义替换。如果该列上已有任何约束,它们将通过与新约束的布尔 AND 关系保留。

目前,要为现有列设置新的默认约束,必须重建并重新装载该表:

CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3) DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
    city     VARCHAR(30)
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
ALTER TABLE table
    DROP DEFAULT default
ALTER TABLE table
    DROP CONSTRAINT constraint { RESTRICT | CASCADE }

从表的定义中移除由 default 指定的默认值或由 constraint 指定的规则。如果指定了 RESTRICT,只有没有依赖约束的约束才能被销毁。如果指定了 CASCADE,任何依赖于该约束的约束也会被删除。

目前,要移除现有列上的默认值或约束,必须重建并重新装载该表:

CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;

ALTER TABLE table
    DROP [ COLUMN ] column { RESTRICT | CASCADE }

从表中移除一个列。如果指定了 RESTRICT,只有没有依赖对象的列才能被销毁。如果指定了 CASCADE,所有依赖于该列的对象也会被删除。

目前,要移除一个现有列,必须重建并重新装载该表:

CREATE TABLE temp AS SELECT did, city FROM distributors;    
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.