更改表的定义。
语法
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;