暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

【每日一练 015】 SQL : set unused语句及对unused column进行恢复

原创 李美静 恩墨学院 2020-07-09
2188

1 删除表中的列

可以使用drop column子句来删除一个表中的列。
如:

alter table dept80 dorp (job_id);
复制

2 set unused选项

可以使用set unused选项标记一个或多个列为unused。
使用drop unused columns语句来删除标记为unused的列。
可以指定online关键字来表示在标记unused的列时允许对表进行DML操作。
语法:

ALTER TABLE	 <table_name>
SET   UNUSED(<column_name> [ , <column_name>]) [online];
OR	
ALTER TABLE  <table_name>
SET   UNUSED COLUMN <column_name> [ , <column_name>] [online];
ALTER TABLE <table_name>
DROP  UNUSED COLUMNS;
复制

设置UNUSED选项将一个或多个列标记为未使用,以便在系统资源需求较低时可以删除它们。指定这个子句并不会实际从表中的每一行删除目标列。因此,响应时间比执行DROP子句要快。UNUSED列被视为已删除,即使它们的列数据仍保留在表行中。当一列被标记为UNUSED后,就不能访问该列。SELECT *查询不会从UNUSED列中检索数据。此外,标记为UNUSED列的名称和类型在DESCRIBE语句期间不会显示,可以向表中添加一个与UNUSED列同名的新列。设置的UNUSED信息存储在USER_UNUSED_COL_TABS字典视图中。可以指定ONLINE关键字来表示在标记UNUSED列时允许对表进行DML操作。

3 DROP UNUSED COLUMNS

删除UNUSED列从表中删除当前标记为未使用的所有列。当需要从表中未使用的列中回收额外的磁盘空间时,可以使用此语句。如果表中没有未使用的列,则语句返回时不会出现错误。
如:

ALTER TABLE  dept80
SET   UNUSED (last_name);
ALTER TABLE  dept80
DROP  UNUSED COLUMNS;
复制

删除unused的列;

4 恢复unused的列

示例:在scott用户下创建表t,将t表的id列设为unused,然后恢复

SCOTT@PROD> create table t (id number,name varchar2(10));
SCOTT@PROD> insert into t values(10,'TEST');
SCOTT@PROD> commit;
SCOTT@PROD> alter table t set unused (id) online;
SCOTT@PROD>  col object_name for a30
SCOTT@PROD>  SELECT OBJECT_ID,OBJECT_NAME FROM USER_OBJECTS where object_name='T';
 OBJECT_ID OBJECT_NAME
---------- ------------------------------
     74130 T
SCOTT@PROD>  conn / as sysdba
Connected.
SYS@PROD> select col#,intcol#,name from col$ where obj#=74130;
      COL#    INTCOL# NAME
---------- ---------- ------------------------------
         0          1 SYS_C00001_20070908:05:36$
         1          2 NAME
SYS@PROD> select cols from tab$ where obj#=74130;
      COLS
----------
         1
SYS@PROD> update col$ set col#=intcol# where obj#=74130;
2 rows updated.
SYS@PROD> select col#,intcol#,name from col$ where obj#=74130;
      COL#    INTCOL# NAME
---------- ---------- ------------------------------
         1          1 SYS_C00001_20070908:05:36$
         2          2 NAME
SYS@PROD> update tab$ set cols=cols+1 where obj#=74130;
1 row updated.
SYS@PROD> update col$ set name='ID'  where obj#=74130 and col#=1;
1 row updated.
SYS@PROD>  update col$ set property=0 where obj#=74130;
2 rows updated.
SYS@PROD> commit;
Commit complete.
SYS@PROD>  startup force
ORACLE instance started.
Total System Global Area  838860800 bytes
Fixed Size                  8626240 bytes
Variable Size             591400896 bytes
Database Buffers          230686720 bytes
Redo Buffers                8146944 bytes
Database mounted.
Database opened.
SYS@PROD> conn scott/tiger
Connected.
SCOTT@PROD> select * from t;
        ID NAME
---------- ------------------------------
        10 TEST

复制

5 练习题
在scott用户下模拟创建表并且对表的列set unused,之后添加列,列名与被设置为unused列的列名和数据类型一样,通过数据字典查询unused的信息,最后删除。将整体操作步骤列出

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论