ITPub博客

首页 > Linux操作系统 > Linux操作系统 > unused column的表可以用truncate掉这些列

unused column的表可以用truncate掉这些列

原创 Linux操作系统 作者:fengjin821 时间:2009-06-23 16:28:03 0 删除 编辑
unused column的表可以用truncate掉这些列吗

如题
ALTER TABLE table_name SET UNUSED (column)
后,truncate能否将这些无用的列一同删掉,即unused的内容是不是会被truncate掉
 
 
 
 
首先需要申明的一点是,从官方上来说,unused的column是不能被再次恢复回来的,因为set unused是ddl语句,是没法rollback的。
而网上有民间办法恢复这一列,通过update col$和tab$,但oracle说并不支持。


对于你这个问题,做做小实验在自己的测试环境中还是可以得出。
答案就是,truncate会truncate unsed column。

实验如下:
USER is "LONGRAW_USER"
SQL> create table haotest(id1 number,id2 number);

Table created.

SQL> insert into haotest values(1,2);

1 row created.

SQL> insert into haotest values(3,4);

1 row created.

SQL> commit;

Commit complete.

SQL> alter table haotest set unused column id2;

Table altered.

SQL> truncate table haotest;

Table truncated.

SQL> select * from haotest;

no rows selected

SQL> desc haotest
Name                                                                                    Null?    Type
--------------------------------------------------------------------------------------- -------- -----------------------------------------------------------
ID1                                                                                              NUMBER


---------这里开始用sys用户,采用民间办法恢复unused这一列
SQL> select object_id,object_name from dba_objects
  2  where wner='LONGRAW_USER' and object_name='HAOTEST';

OBJECT_ID OBJECT_NAME
---------- ------------------------------
     50277 HAOTEST

SQL> select obj#,dataobj#,cols from tab$ where obj#=50277;

      OBJ#   DATAOBJ#       COLS
---------- ---------- ----------
     50277      50278          1

SQL> select obj#,col#,intcol#,property,name from col$ where obj#=50277;

      OBJ#       COL#    INTCOL#   PROPERTY NAME
---------- ---------- ---------- ---------- ------------------------------------------------------------------------------------------
     50277          1          1          0 ID1
     50277          0          2      32800 SYS_C00002_09062201:49:55$

SQL> update tab$ set cols=2 where obj#=50277;

1 row updated.

SQL> update col$ set col#=2,intcol#=2,property=0,name='ID2'
  2  where property=32800 and obj#=50277;

1 row updated.

SQL> commit;

Commit complete.

SQL> select obj#,dataobj#,cols from tab$ where obj#=50277;

      OBJ#   DATAOBJ#       COLS
---------- ---------- ----------
     50277      50278          2

SQL> select obj#,col#,intcol#,property,name from col$ where obj#=50277;

      OBJ#       COL#    INTCOL#   PROPERTY NAME
---------- ---------- ---------- ---------- ------------------------------------------------------------------------------------------
     50277          1          1          0 ID1
     50277          2          2          0 ID2

SQL> alter system flush shared_pool;

System altered.



--------------------返回表所在用户--------------
SQL> desc haotest;
Name                                                                                    Null?    Type
--------------------------------------------------------------------------------------- -------- -----------------------------------------------------------
ID1                                                                                              NUMBER
ID2                                                                                              NUMBER

SQL> select count(*) from haotest;

  COUNT(*)
----------
         0




----------------------------------------------


可以看出,即使通过民间办法恢复unused的列之后,那列仍旧没有数据。
所以truncate会全部干掉,包括unused的列
 
 
 
 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13165828/viewspace-607287/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-29

  • 博文量
    191
  • 访问量
    505059