ALTER TABLE

更改表的定义。

语法

ALTER TABLE name
  action [, ...]
ALTER TABLE name
  RENAME COLUMN column TO new_column
ALTER TABLE name
  RENAME TO new_name

其中,action可以为以下语句之一:

ADD column type [ column_constraint [ ... ] ]
DROP COLUMN column
ADD table_constraint
DROP CONSTRAINT constraint_name [ CASCADE ]
ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]
ALTER [ COLUMN ] column_name SET DEFAULT expression
ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
DISABLE TRIGGER [ trigger_name | ALL | USER ]
OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }

说明

当基础表上建有简单视图,支持直接修改基础表列的数据类型(alter table alter column),无需先删除关联视图。

ALTER TABLE更改现有表的定义。有多种子格式:

  • ADD column type:此格式使用与CREATE TABLE相同的语法将新列添加到表中。

  • DROP COLUMN:此格式从表中删除列。涉及该列的索引和表约束也将自动删除。

  • ADD table_constraint:此格式使用与CREATE TABLE相同的语法将新约束添加到表中。

  • DROP CONSTRAINT:此格式删除表上的约束。目前,表上的约束不必具有唯一名称,因此可以有多个约束与指定的名称匹配。将删除所有匹配的约束。

  • RENAME:RENAME格式更改表(或索引、序列或视图)的名称,或者更改表中单独列的名称。这对存储的数据没有任何效果。

您必须拥有表才能使用ALTER TABLE。

说明

当您调用ADD COLUMN时,表中的所有现有行将使用该列的默认值初始化(如果未指定DEFAULT子句,则为null)。添加一个具有非null默认值的列时,需要重写整个表。对于较大的表而言,这可能需要相当长的时间,并且会临时需要两倍的磁盘空间。添加CHECK或NOT NULL约束需要扫描表来验证现有行是否满足约束。

DROP COLUMN格式不会实际删除列,而只是使列对SQL操作不可见。表中后面的插入和更新操作会为该列存储null值。因此,删除列速度很快,但不会立即减少表在磁盘上占用的大小,因为所删除列占用的空间未回收。随着时间推移,在更新现有行之后,将回收该空间。

不允许更改系统目录表的任何部分。请参阅CREATE TABLE,进一步了解有效参数的说明。

参数

参数

说明

name

要变更的现有表的名称(可能是schema限定的)。

column

新列或现有列的名称。

new_column

现有列的新名称。

new_name

表的新名称。

type

新列的数据类型。

table_constraint

表的新表约束。

constraint_name

要删除的现有约束的名称。

CASCADE

自动删除依赖于所删除约束的对象。

示例

将类型为VARCHAR2的列添加到表中:

ALTER TABLE emp ADD address VARCHAR2(30);

从表中删除列:

ALTER TABLE emp DROP COLUMN address;

重命名现有列:

ALTER TABLE emp RENAME COLUMN address TO city;

重命名现有表:

ALTER TABLE emp RENAME TO employee;

将检查约束添加到表中:

ALTER TABLE emp ADD CONSTRAINT sal_chk CHECK (sal > 500);

从表中删除检查约束:

ALTER TABLE emp DROP CONSTRAINT sal_chk;