在创建表后,如果发现对表的定义有不满意的地方,可以对表进行修改。这些修改操作包括增加或删除表中的字段、改变表的存储参数设置以及对表进行增加、删除和重命名等操作。普通用户只能对自己模式中的表进行修改,如果要对任何模式中的表进行修改操作,用户必须具有ALTER ANY TABLE系统权限。
创建一张学生信息表,用于实例的操作使用。
--创建“学生信息”数据表
CREATE TABLE STUDENT_INFO
(
STU_ID INT NOT NULL, --学号
STU_NAME VARCHAR2(8), --姓名
SEX CHAR(2), --性别
AGE INT, --年龄
CLASS_NAME VARCHAR2(20), --班级名称
REGDATE DATE DEFAULT SYSDATE --创建期间
);
1、增加和删除字段
在创建表后,可能会需要根据应用需求的变化向表中增加或删除列,用户可以使用ALTER TABLE…ADD语句能够向表中添加新的字段。
【实例】在STUDENT_INFO(学生信息)表中增加一个address(地址)新字段。ALTER TABLE STUDENT_INFO ADD(ADDRESS VARCHAR2(50));
【实例】在STUDENT_INFO(学生信息)表中删除一个address(地址)字段。
ALTER TABLE STUDENT_INFO DROP COLUMN ADDRESS;
【实例】在STUDENT_INFO(学生信息)表中同时删除sex和age字段。
ALTER TABLE STUDENT_INFO DROP (SEX,AGE);
2、修改字段
除了在表中增加和删除字段外,还可以根据实际情况修改字段的有关属性,包括修改字段的数据类型的长度、数字列的精度、列的数据类型和列的默认值等。修改字段通常使用ALTER TABLE…MODIFY语句,其语法格式如下:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAMECOLUMN_PROPERTY
TABLE_NAME:表示要修改的列所在的表名称。
COLUMN_NAME:要修改的列名称。
COLUMN_PROPERTY:要修改列的属性,包括数据类型的长度、数字列的精度、列的数据类型和列的默认值等。
【实例】将STUDENT_INFO(学生信息)表中的STU_NAME字段的长度由8位更改为16位。
ALTER TABLE STUDENT_INFO MODIFY STU_NAME VARCHAR2(16);
3、重命名表
在创建表后,用户可以修改指定表的名称,但用户只能对自己模式中的表进行重命名。重命名表通常使用ALTER TABLE…RENAME语句,其语法格式如下:
ALTER TABLE TABLE_OLD_NAME RENAME TOTABLE_NEW_NAME
TABLE_OLD_NAME:表示原表名称。
TABLE_NEW_NAME:表示新表名称。
【实例】将STUDENT_INFO(学生信息)表重命名为STUDENT_INFO_NEW。
ALTER TABLE STUDENT_INFO RENAME TO STUDENT_INFO_NEW;
4、删除和恢复表
数据表在创建之后,根据实际需求情况,用户还可以将其删除。但需要注意的是,一般情况下用户只能删除自己模式中的表,如果要删除其它模式中的表,则必须具有DROP ANY TABLE系统权限。删除表通常使用DROP TABLE语句,其语法格式如下:
DROP TABLE TABLE_NAME [CASCADECONSTRAINTS];
参数TABLE_NAME表示要删除的表名称。如果该表存在约束、关联的视图和触发器等,则必须使用“CASCADE CONSTRAINTS”这个可选的子句才能将其删除。
【实例】删除STUDENT_INFO(学生信息)表。
--删除表
DROP TABLE STUDENT_INFO;
--删除表以及所有引用这个表的视图、约束或触发器等
DROP TABLE STUDENT_INFO CASCADE CONSTRAINTS;
【实例】利用Oracle 11g的闪回功能快速恢复被删除的STUDENT_INFO(学生信息)表。
--查询数据字典视图RECYCLEBIN来了解该表是否在回收站中
SELECT OBJECT_NAME,ORIGINAL_NAME FROM RECYCLEBIN WHERE ORIGINAL_NAME = 'STUDENT_INFO'
--恢复数据表
FLASHBACK TABLE STUDENT_INFO TO BEFORE DROP;
5、修改表的状态
Oracle 11g推出了一个新的特性,用户可以将表置于READONLY(只读)状态。处于该状态的表不能执行DML和某些DDL操作。在Oracle 11g之前,为了使某个表处于READ ONLY状态,只能通过整个表空间或者数据库置于READ ONLY状态,这样影响范围太大,不利益实际操作。
【实例】将STUDENT_INFO(学生信息)表置于只读状态。
ALTER TABLE STUDENT_INFO READ ONLY;
【实例】将STUDENT_INFO(学生信息)表从只读状态更改为读写状态。
ALTER TABLE STUDENT_INFO READ WRITE;