10.1.3 表的修改
在数据库服务器的运行过程中,如果发现表的设计不合理,可以对其进行修改。一般来说,对表的修改涉及以下内容:
·表的结构的修改,如增加列、删除列、修改某个列的定义。
·约束的修改,如添加约束、删除约束、激活约束与禁止约束。
·修改表的物理属性,如PCTFREE参数、PCTUSED参数。
·表的移动,如移动到一个新的数据段或表空间。
·表的存储空间的手工分配和回收。
其中前两项内容在第1章中已经进行了详细的描述,本节仅对其他内容进行描述。
修改表的命令是ALTER TABLE,普通用户只能修改自己的表。如果要修改其他用户的表,必须具有ALTER ANY TABLE系统权限。
1.修改表的物理属性
在创建表时可以指定PCTFREE、PCTUSED、INITRANS、CACHE等参数,这些参数对于表中存储空间的利用有直接的影响。表在创建以后,用户也可以对这些参数进行修改。例如,下面的语句对表T5的参数进行了修改:
SQL>ALTER TABLE T5
PCTFREE 30 PCTUSED 60
INITRANS 15 MAXTRANS 220
CACHE
NOLOGGING;
2.表的移动
表的移动意味着把表中的数据移动到一新的表段中,同时可以把表段移动到另外一个表空间中。表的移动在以下场合非常有用:
·消除表中的存储碎片。
·消除表中数据块间的链接。
·把表移动到另外一个表空间中。
·修改表所使用的数据块大小。
在对表进行移动时,表中的数据将被重新排列,这样就可以消除表中的存储碎片和数据块的链接。如果两个表空间所使用的数据块大小不同,那么表在两个表空间中移动时,也将使用不同大小的数据块。
移动表所使用的命令是ALTER TABLE。在移动表时,先为表创建一个新的表段,然后把表中的数据移动到这个新段中,最后删除原来的表段。例如:
SQL>ALTER TABLE T2
MOVE;
又如,下面的ALTER语句用于把表T2移动到表空间TOOLS中:
SQL>ALTER TABLE T2
MOVE
TABLESPACE TOOLS;
需要注意的是,表被移动后,表的行号将发生变化,所以表上原来的索引将不可用。在表移动后应该删除原来的索引并重新创建。
3.存储空间的手工分配和回收
表在创建后,随着数据的增加,Oracle将按照存储参数的设置不断为表分配新的区。这一过程是自动进行的,不需要用户的干预。
在有些情况下,用户希望为表分配一个指定大小的区,这时需要利用ALTER TABLE命令及其ALLOCATE EXTENTS子句为表手工分配一个区。
在手工为表分配区时,可以为其指定大小。如果没有指定大小,数据库服务器将按照该表所在表空间的区大小,为表分配一个区。例如,以下语句为表T2手工分配了一个512KB的区:
SQL>ALTER TABLE T2
ALLOCATE EXTENT(SIZE 512K);
实际上,手工指定的区大小与该表所在表空间的区大小可能不一致。假设表空间的区大小是64KB,那么上述命令的执行结果是为表T2分配了8个64KB的区。
在表段的HWM以下,可能有一些尚未使用的数据块。为了节省磁盘空间,可以通过命令把这些存储空间回收。例如:
SQL>ALTER TABLE T2 DEALLOCATE UNUSED;