3修改表结构
修改表结构是对已经创建完成(实际是存放在数据库字典里)的表的结构进行修改。不同的Oracle版本允许对表的修改也不一样。新版的Oracle8i可以对表中的列进行删除。
3.1 修改表结构命令修改表结构的命令由ALTER TABLE来完成。该命令的参数较多,下面仅给出一些基本的部分。详细请参考《ORACLE8i SQL REFERENCE》 。
ALTER TABLE [user.] table
[ADD ({colum_element|table_constraint}
[,{column_element|table_constraint}]...)] [MODIFY(column_element[,column_element]...)] [DROP CONSTRAINT constraint]...
[PCTFREE integer][PCTUSED integer]
[INITRANS integer][MAXTRANS integer]
[STORAGE storage]
[BACKUP]
ALTER TABLE可以作的操作有:
l增加一个列(字段)宽度;
l减少一个列(字段)宽度(该列必须无数据);
l增加一个列(字段);
l修改列的定义;
l 或一个限制;(如数据类型,NOT NULL);仅当某列的值为空时才能修改其类型;
l去掉限制;
l修改存储分配;
l记录表已作过BACKUP;
l删除已存在的列(仅Oracle8i及以后版本);
l重新定位和组织表(仅Oracle8i及以后版本);
l 将表标识为不可用(仅Oracle8i及以后版本)。
3.2 修改表结构例子
例1:对已经存在的表增加一新的列:
SQL>alter table dept add ( headcount number(3) );
例2:对表的列修改其大小:
SQL>alter table dept modify( Dname char(20) );
如果被修改的列没有空(已有数据),则被提示:
ORA-01439: Column to be modified must be empty to change
datatype
ORA-01441: Column to be modified must be empty to decrease
column length
例3:复制一个表:
CREATE TABLE HOLD_TANK AS SELECT TANK_NO, CHIEF_CARETAKER_NAME
FROM TANK;
例4:参照某个已存在的表建立一个表结构(不需要数据)
create table emp2 as select * from emp where rownum<1;
例5:修改已存在表存储参数:
Alter table emp2 storage( next 256k pctincrease 0 );
例6:删除表中的列:
这是Oracle8i的新功能,它的基本语法为:ALTER TABLE . . . . . . DROP COLUMN [ CASCADE CONSTRAINTS ];
如:
Alter table emp drop column comm ;
例7:重新定位和组织表:
这是Oracle8i的新功能,可以实现:
l将未分区的表从一个表空间移到另一个表空间;
l 重新组织一个未分区表的存储。
它的基本语法为:
ALTER TABLE . . . . . . MOVE TABLESPACE ;
如:
Alter table emp move tablespace users;
例8:将表标识为不可用:
这是Oracle8i的新功能,可以实现对空间的收回等。
基本语法为:
ALTER TABLE . . . . . . SET UNUSED COLUMN;
如:
Alter table emp set UNUSED COLUMN xyz;
提示:虽然Oracle允许用户对表的结构进行修改。但建议你在工作中不要采用方式。因为表结构被多次修改会影响应用系统的性能。
3.3 删除表结构Oracle提供DROP TABLE命令可以实现删除表数据和结构。提醒初学者,不要轻易使用DROP TABLE命令。DROP TABLE 命令语法:DROP TABLE [user.]table_name[CASCADE CONSTRAINTS] CASCADE CONSTRAINTS表示所有指向本表的主键,外部键被删掉。当删除一个表时,下面的对象也随之被删掉。
l表的索引;
l指向本表的外部键;
l本表的触发器;
l本表中的分区;
l本表的快照;
l本表的角色和用户权限;
l 加在本表的所有限制。
提示:如果你在定义表结构时,采用了主键、外部键来定义了一序列表。则在删除表结构时要小心。不要轻易用CASCADE子句。
3.4 使用CHECK作限制约束Oracle提供了一个很有用的子句CHECK,它可以实现对数据的自动检查。它的用法是在创建表结构时使用。如:
本文出自 51CTO.COM技术博客
上一篇 138端口解析 下一篇 java: cannot execute binary file 如果遇到这..
类别:数据库系列┆技术圈(0)┆阅读(9)┆评论(1)┆推送到技术圈┆返回首页
文章评论
[1楼] jxwpx
2009-11-05 10:06:21
Create table worker
( empno number(4) primary key,
name varchar2(10),
age number(2) CHECK(age between 18 and 65 ),
/* age number(2) CHECK( age >=18 and age<=65 ) */
lodging char(15) References LODGING(lodging)
);
Create table emp3
( empno number(4) constraint abc primary key,
ename varchar2(10),
job varchar2(10),
sex char(2) check ( sex=‘男’ or sex=‘女’),
mgr number(4),
hiredate date,
sal number(7,2), /*工资 */
comm number(7,2), /*奖金 */
deptno number(2),
CHECK ( sal+comm >0 and sal+comm<=5000 )
);
建议:在设计数据库表结构时,建议你分析用户的数据的取值范围,从而将那些取值范围一定的字段用CHECK进行描述。以保证以后数据的正确性。
3.5 使用UNRECOVERABLE创建表
对于特殊的需要,可以考虑将表创建成为不需恢复(UNRECOVERABLE)的表。如复制一个已存在的表就可以采用这种方法以减少系统的开销。如:
例:参考emp表创建一个新的emp_new表:
SQL> create table new_emp as select * from emp UNRECOVERABLE;
表已创建。
或
CREATE TABLE new_emp AS select * from emp NOLOGGING;
注:虽然上面提到UNRECOVERABLE,但是Oracle推荐你使用NOLOGGING或LOGGING;
责任编辑:小草