由于商业环境中,数据是不断变化的,客户的需求也是不断变化的,所以当一个表用了一段时间后,其结构就有可能需要变化。
而在Oracle中,提供了alter table
这种方式来改变列。
从Oracle9.2版本之后:
如果需要变更列名,可以通过以下命令:
alter table 用户名.列名
rename column 旧列名
to 新列名
but修改表中一列名字的操作是会受到一些限制的。
如果所要改名的列上有索引,这列的名就不能修改。如果要修改,必须先将上面的索引删除掉。
另外,修改表中的某一列后,基于该表的视图,触发器,函数,过程和软件包等状态都将成为无效,因此需要重新编译。
- 对于一个大型的数据库这样做的成本太高。
当某一个列没用时,可以从表中删除这一列。删除列命令从每一行中删除列的长度和数据,并释放数据块中的空间。删除大型表中的一列需要相当长的时间。
在一个表中删除一列的命令如下:
alter table 用户名.表名
drop column 列名
cascade constraints checkpoint 行数;
使用上述的语句注意事项:
- 一次只能删除一列
- 删除一列之后,该表必须至少还有一列
- 因为alter table是DDL语句,所以删除的列是无法恢复的
- 删除的列可以包含数据也可以不包含数据
- 该语句只能在Oracle 8i以上的版本中使用
上面说了,在一个大表中执行这个删除列的命令是十分耗时的,并且需要大量的还原磁盘空间,因此对系统的效率冲击很大。
因此应该尽可能避免在数据库繁忙期间使用上述DDL语句。
当在一个大表中删除一列时,可以通过使用checkpoint 行数;
选项来减少还原磁盘空间的使用量。
例如:
在删除命令中使用了check point 1250;Oracle没做1250行的操作就会自己产生一个检查点。如果在执行这个命令期间,系统崩溃了,当重新启动系统后该命令可以从检查点开始继续它的工作,而不必重新开始。
alter table 用户名.表名 drop column continue;
但如果现在表执行十分繁忙,而你的大老板让你立即删除某一个大表中的一列。这个时候又该如何处理呢?
又不可能说键盘给你,你来弄。O(∩_∩)O嗯!
这个Oracle中也有一个折中的方案:
在alter table中使用set unused
子句。在一个表中把某一列设置成无用
:
alter table 用户名.表名
set unused 列名 cascade constraints;
然后,当数据库空闲时,再利用以下的DDL语句来删除已设置为无用的列:
alter table 用户名.表名
drop unused columns checkpoints;
注意事项:
- 只能在Oracle 8i版本以上使用
- 只是做一个记号,并不是真正的删除这个列。
- 无法使用SQL*PLUS或者SQL语句看到
- Oracle把设置成无用的列当做删除的列处理
- 可以把一列或者多列设置成无用
- 可以使用DROP列名选项来删除被设置成无用的列
- 因为语句是DDL,因此没有恢复无用的列命令。
跟上上面同理,如果在该命令执行期间,系统崩溃了,当重启系统后该命令可以从检查点开始继续它的工作,不必从头开始。
格式如下:
alter table 用户名.表名 DROP COLUMNS CONTINUE 行数;
ok,上述就是Oracle列的维护。
我已讲完。