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博客 ” ,链接:https://blog.itpub.net/13165828/viewspace-607287/
,如需转载,请注明出处,否则将追究法律责任。