ALTER TABLE
ALTER TABLE — 修改表属性
大纲
ALTER TABLEtable[ * ] ADD [ COLUMN ]columntypeALTER TABLEtable[ * ] RENAME [ COLUMN ]columnTOnewcolumnALTER TABLEtableRENAME TOnewtable
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
tableALTER [ COLUMN ]columnSET DEFAULTdefaultALTER TABLEtableALTER [ COLUMN ]columnADD [ CONSTRAINTconstraint]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
tableDROP DEFAULTdefaultALTER TABLEtableDROP CONSTRAINTconstraint{ 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
tableDROP [ 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;