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

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 7.2 已结束支持。 请参阅 当前版本手册.

ALTER TABLE

ALTER TABLE — 更改一个表的定义

大纲

ALTER TABLE [ ONLY ] table [ * ]
    ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
ALTER TABLE [ ONLY ] table [ * ]
    ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE [ ONLY ] table [ * ]
    ALTER [ COLUMN ] column SET STATISTICS integer
ALTER TABLE [ ONLY ] table [ * ]
    RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
    RENAME TO new_table
ALTER TABLE table
    ADD table_constraint_definition
ALTER TABLE [ ONLY ] table 
	DROP CONSTRAINT constraint { RESTRICT | CASCADE }
ALTER TABLE table
	OWNER TO new_owner 
  

输入

table

要更改的现有表的名称。

column

新列或现有列的名称。

type

新列的类型。

newcolumn

现有列的新名称。

new_table

表的新名称。

table_constraint_definition

表的新表约束

new_owner

表的新所有者的用户名。

输出

ALTER

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

ERROR

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

描述

ALTER TABLE 更改一个现有表的定义。ADD COLUMN 形式使用与CREATE TABLE相同的语法向表添加一个新列。ALTER COLUMN SET/DROP DEFAULT 形式允许你为列设置或移除默认值。注意,默认值只会应用于后续的 INSERT 命令;它们不会导致表中已有的行发生变化。ALTER COLUMN SET STATISTICS 形式允许你为后续 ANALYZE 操作设置统计信息收集目标。RENAME 子句更改表、列、索引或序列的名称,而不更改任何数据。命令执行后,数据仍保持相同的类型和大小。ADD table_constraint_definition 子句使用与CREATE TABLE相同的语法向表增加一个新约束。DROP CONSTRAINT constraint 子句删除表(及其子表)上所有与 constraint 匹配的约束。OWNER 子句把表的所有者更改为用户 new user。

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

注意

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

在当前 ADD COLUMN 的实现中,不支持新列的默认值和 NOT NULL 子句。可以在之后使用 ALTER TABLE 的 SET DEFAULT 形式设置默认值。(你可能还想用UPDATE把已有的行更新为新默认值。)

在 DROP CONSTRAINT 中,RESTRICT 关键字是必需的,但尚未检查依赖关系。CASCADE 选项不受支持。目前 DROP CONSTRAINT 只删除 CHECK 约束。要移除 PRIMARY 或 UNIQUE 约束,请用 DROP INDEX 命令删除相关的索引。要移除 FOREIGN KEY 约束,你需要用CREATE TABLE命令的其他参数重建并重新装载该表。

例如,要删除表 distributors 上的所有约束:

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

要更改表,你必须拥有它。不允许更改系统目录模式的任何部分。PostgreSQL 用户指南中还有关于继承的更多信息。

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

用法

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

ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
   

要重命名一个现有列:

ALTER TABLE distributors RENAME COLUMN address TO city;
   

要重命名一个现有的表:

ALTER TABLE distributors RENAME TO suppliers;
   

要向一个表增加一个检查约束:

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
   

要从一个表及其所有后代移除一个检查约束:

ALTER TABLE distributors DROP CONSTRAINT zipchk RESTRICT;
   

为一个表增加一个外键约束:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL;
   

为一个表增加一个(多列)唯一约束:

ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
   

为一个表增加一个自动命名的主键约束,注意一个表只能拥有一个主键:

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
   

兼容性

SQL92

ADD COLUMN 形式符合标准,但不支持默认值和 NOT NULL 约束,如上所述。ALTER COLUMN 形式完全符合标准。

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

ALTER TABLE table DROP [ COLUMN ] column { 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;
       

重命名表、列、索引和序列的子句是 PostgreSQL 对 SQL92 的扩展。

报告文档问题

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