Oracle的SET UNUSED COLUMN操作到底做了什么?

    我们先来搞一个测试, 将其中的一个列设为UNUSED:

SQL> DESC T_FID
Name                    Null?    Type
----------------------- -------- -------
COL1                            NUMBER
COL2                            NUMBER
COL3                            NUMBER
SQL> ALTER TABLE T_FID SET UNUSED (COL3);
Table altered.
SQL> alter system checkpoint;
System altered.

    然后我们去查COL$表中的三列(COL#,SEGCOL#,NAME), 看看值是什么? 在这儿为了方便, 我就用AUL/MyDUL的DESC命令去看了

AUL> desc alex.t_fid
Storage(OBJ#=7641 OBJD=7641 TS=2 FILE=3 BLOCK=1529 CLUSTER=0)
No. SEQ Column Name                  Type
--- --- ----------------------------- ----------------
  1  1 COL1                          NUMBER
  2  2 COL2                          NUMBER
  0  3 SYS_C00004_05092817:31:11$    NUMBER

AUL> UNLOAD TABLE alex.t_fid;
2005-09-28 17:32:40
Unload OBJD=7641 FILE=3 BLOCK=1529 CLUSTER=0 ...
9,8,7
2005-09-28 17:32:40

    从这儿可以看到, SET UNUSED时将一个列的名字换一下, 此外还将这个列的显示顺序的值设为0, 原来为3. 虽然Oracle不提供反向操作,但实际上原来的数据还存在, 不提供的原因可能是因为不能保证not null和其他的约束吧.

留言 (3)

关于unused,我作了一个实验.
就你说的,他只是把显示顺序值和名称改了.
我就UPDATE COL$ 把它改回来也没有用.
SELECT 表的时候还是显示一个字段.
是不是他还更新了其它的表.

我当时是从文件格式的角度出发的, 没有想过这样将它改回来.

用sql_trace跟踪下unused操作
应该还对其他的数据字典进行了修改

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • What are you doing?
  • 你在干什么?
  • I'm reading a book.
  • 我在看书.
  • I'm cooking.
  • 我在做饭.
  • Are you watching TV now?
  • 你在看电视吗?
  • Yes, I'm watching Channel 5.
  • 是的, 我在看5频道.