以scott用户下的emp、detp等几个表作为示例,在sqlplus下演示。
1. 查看表结构:
SQL> desc emp;
2. 在现有表基础上建立新表:
SQL> create table t1 as select * from emp;
表已创建。
当然,此处select * from emp可以灵活更改。
如果想更改列名,有两种办法:
1).
SQL> create table t1 as select ename a, empno b, sal c from emp;
表已创建。
SQL> desc t1;
名称 是否为空? 类型
----------------------------------------------------- -------- ------------
A VARCHAR2(10)
B NUMBER(4)
C NUMBER(7,2)
2).
SQL> create table t1(a, b, c) as select ename,empno,sal from emp;
表已创建。
SQL> desc t1;
名称 是否为空? 类型
----------------------------------------------------- -------- -------------
A VARCHAR2(10)
B NUMBER(4)
C NUMBER(7,2)
3. 修改表结构:
1). 修改列长度,将上述t1表A列长度设为20:
SQL> desc t1;
名称 是否为空? 类型
----------------------------------------------------- -------- -------------
A VARCHAR2(10)
B NUMBER(4)
C NUMBER(7,2)
SQL> alter table t1 modify(a varchar2(20));
表已更改。
SQL> desc t1;
名称 是否为空? 类型
----------------------------------------------------- -------- -------------
A VARCHAR2(20)
B NUMBER(4)
C NUMBER(7,2)
如果要缩短列的长度,那么要保证该列的值没有超过要设置的列长。例如:
SQL> alter table t1 modify(a varchar2(10));
表已更改。
SQL> alter table t1 modify(a varchar2(2));
alter table t1 modify(a varchar2(2))
*
第 1 行出现错误:
ORA-01441: 无法减小列长度, 因为一些值过大
同理,如果要修改列的类型,那么此列的值都应该为空。否则如下:
SQL> alter table t1 modify(a number(10,2));
alter table t1 modify(a number(10,2))
*
第 1 行出现错误:
ORA-01439: 要更改数据类型, 则要修改的列必须为空
2). 修改表名:
SQL> rename t1 to t2;
表已重命名。
SQL> desc t1;
ERROR:
ORA-04043: 对象 t1 不存在
SQL> desc t2;
名称 是否为空? 类型
----------------------------------------- -------- ------------
A VARCHAR2(10)
B NUMBER(4)
C NUMBER(7,2)
3.) 修改列名称:
SQL> desc t2;
名称 是否为空? 类型
----------------------------------------- -------- -------------
A VARCHAR2(10)
B NUMBER(4)
C NUMBER(7,2)
SQL> alter table t2 rename column a to d;
表已更改。
SQL> desc t2;
名称 是否为空? 类型
----------------------------------------- -------- -------------
D VARCHAR2(10)
B NUMBER(4)
C NUMBER(7,2)
4). 表注释:
SQL> select comments from user_tab_comments where table_name='T2';
COMMENTS
-------------------------------------------------------------------
SQL> comment on table t2 is '测试表';
注释已创建。
SQL> select comments from user_tab_comments where table_name='T2';
COMMENTS
-------------------------------------------------------------------
测试表
5).列注释
SQL> SELECT COMMENTS FROM USER_COL_COMMENTS WHERE TABLE_NAME='T2';
COMMENTS
------------------------------------------------------------------
SQL> COMMENT ON COLUMN T2.D IS '测试列注释';
注释已创建。
SQL> SELECT COMMENTS FROM USER_COL_COMMENTS WHERE TABLE_NAME='T2';
COMMENTS
------------------------------------------------------------------
测试列注释
4. 删除表
SQL> drop table t2;
表已删除。
其实这里并没有将表真的删除,知识把它放到回收站里了。可以查看一下:
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T2 BIN$l0t3+wZLRb+jDCDBmZ1dhA==$0 TABLE 2011-10-31:20:41:43
可以看到,original name即原始名称是t2,回收站里的名称是那一长串字符。
也可以查看一下用户现有的表:
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$l0t3+wZLRb+jDCDBmZ1dhA==$0 TABLE
BONUS TABLE
D TABLE
DEPT TABLE
E TABLE
EMP TABLE
PLAN_TABLE TABLE
SALGRADE TABLE
T3 TABLE
TEST TABLE
5. 将回收站的表清空
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T2 BIN$l0t3+wZLRb+jDCDBmZ1dhA==$0 TABLE 2011-10-31:20:41:43
SQL> purge table t2;
表已清除。
SQL> show recyclebin;
6. 将回收站的表还原
SQL> create table t2 as select * from emp;
表已创建。
SQL> drop table t2;
表已删除。
SQL> flashback table t2 to before drop;
闪回完成。
7. 清空当前用户下的recyclebin
SQL> purge recyclebin;
回收站已清空。
8. 删除表的时候,彻底删除,不放入回收站:
SQL> drop table t2 purge;
表已删除。
SQL> show recyclebin;
这样的话,回收站里就空了,如果想要恢复表的话只能取备份来恢复了...比较麻烦了~