↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 已于 2007 年 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 的扩展。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。