列的维护(Oracle)

来源:互联网 发布:安知我意txt 编辑:程序博客网 时间:2024/06/05 04:14

如果,表中某一列的名字取的不合适,可以重新命名这一列。格式如下:
alter table 用户名.表名
rename column 旧列名
to 新列名;

修改表中一列名字的操作时受到一些限制的。如果所要改名的列上有索引,这列的名就不能修改。如果要修改,就要先将上面的索引删除掉。
   另外,修改表中一列的名字后,基于该表的视图,触发器,函数,过程和软件包等的状态都将成为无效,因此需要重新编译。对于一个大型的数据库这样的成本可能太高。

    因此,建议不要修改列名,如果某一列名确实要改,可以通过创建视图或在输出结果时使用列名来解决这一问题。
    当某一列没用时,可以删除掉,删除列是从每一行中删除列的长度和数据,并释放数据块中的空间。删除大型表中的一列需要相当长的时间。在一个表中删除一列的命令如下:
alter table 用户名.表名
drop column 列名
cascade constraints checkpoint 行数;
删除在一个表中已经存在的列要注意以下的事项:
*使用以上的alter table语句,一次只能删除一列.
*在使用以上的alter table语句删除了一列时,表中必须至少还有一列。
*因为alter table是DDL语句,所以删除的列是无法恢复的。


在一个表中删除一列,特别是在一个大表中删除一列时相当耗时的,并且需要大量的还原磁盘空间。因此对系统的效率冲击很大。所以应该避免在数据库繁忙期间使用上述DDL语句。当在一个大表中删除一列时,可通过checkpoint 行数来减少还原磁盘空间的使用量。例如在删除命令中说明了"checkpoint 500",Oracle每做了500行的操作就会产生一个检查点。如果在该命令执行期间发生系统崩溃,当重新启动系统后该命令可以从检查点开始继续工作,而不必重新开始,格式如下:
alter table 用户名.表名 drop columns continue;

那如果当前数据库非常忙,但老板让你立即删除某一个大表中的一列,怎么办呢?我们可以在使用alter table语句使用set unused子句。将一个表中的那一列设置为无用(unused),命令如下:
alter table 用户名.表名
set unused 列名 cascade constraints;

当数据库空闲时,再利用以下的DDL语句来删除已设置为unused的列.
alter table 用户名.表名
drop unused columns checkpoint 行数;

使用set unused把表中的一列设置为无用要注意:
*只是设为无用,并不是真的删除
*设置为无用的列无法使用sql*plus命令或sql语句看到。
*Oracle把设置为无用的列当做删除列处理
*可以把一列也可以把多列设置为无用。
*可以使用drop列名删除无用的列
*由于是DDL命令,所以不能恢复

如果在该命令执行期间系统崩溃了,可以使用alter table 用户名.表名 drop columns continue 行数;

 

整理自 何明《Oracle DBA基础培训教程》