ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 恢复被设置为Unused的字段

恢复被设置为Unused的字段

原创 Linux操作系统 作者:xz43 时间:2010-12-22 14:36:05 0 删除 编辑
有时为了删除某个大数量量表上的某个字段,会采用先把这个字段设置为Unused,等系统空闲时,再drop掉该字段的方式。那假如我们不想删除,怎样恢复被设置为Unused的字段咧?
 
打开窗口1,已普通用户连接数据库:
SQL> create table deployee ( ID integer,NAME varchar2(10),ID_CARD varchar(20));
Table created
SQL> insert into deployee values (1,'汤小娟','32068219950223628X');;
1 row inserted
SQL> insert into deployee values (2,'邹艳丽','32068219940801326X');;
1 row inserted
SQL> insert into deployee values (3,'郭其蒙','32068219941220410X');
1 row inserted
SQL> commit;
Commit complete
 
这个时候,打开窗口2,通过sysdba的身份连接数据库,查看该表的字段数如下:
SQL> select obj# from sys.obj$ where name=upper('deployee');
      OBJ#
----------
    189690
SQL> select cols from sys.tab$ where obj#=189690;
      COLS
----------
         3
然后,我们在窗口1中,设置字段Name为unused
SQL> alter table deployee set unused column NAME;
Table altered
 
此时,回到窗口2,再执行刚才的查询,查看该表现在的字段数如下:
SQL> select cols from sys.tab$ where obj#=189690;
      COLS
----------
         2
回到窗口1中,在该表中,新增同名字段Name varchar(20);
SQL> alter table deployee add NAME varchar(20);
Table altered
 
此时,回到窗口2,再执行刚才的查询,查看该表现在的字段数如下:
SQL> select cols from sys.tab$ where obj#=189690;
      COLS
----------
         3
 
回到窗口1中,开始考虑怎样恢复名称已被占用的列:
SQL> select COL#,INTCOL# from sys.COL$ WHERE OBJ#=189690;
      COL#    INTCOL#
---------- ----------
         1          1
         0          2
         2          3
         3          4
SQL> update col$ set col#=intcol# where obj#=189690;
已更新 4 行。
SQL> update sys.tab$ set cols=cols+1 where obj#=189690;
已更新 1 行。
SQL> select name,col# from sys.col$ where obj#=189690;
NAME                                 COL#
------------------------------ ----------
ID                                      1
SYS_C00002_10122214:33:06$              2
ID_CARD                                 3
NAME                                    4
SQL> update sys.col$ set name='OLD_NAME' where obj#=189690 and col#=2;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select name,col# from sys.col$ where obj#=189690;
NAME                                 COL#
------------------------------ ----------
ID                                      1
OLD_NAME                                2
ID_CARD                                 3
NAME                                    4
SQL> select property from sys.col$ where obj#=189690;
  PROPERTY
----------
         0
     32800
         0
         0
SQL> update col$ set property=0 where obj#=189690;
已更新4行。
SQL> commit;
提交完成。
SQL> select property from sys.col$ where obj#=189690;
  PROPERTY
----------
         0
         0
         0
         0
SQL>
至此,修改完成,重启数据库即可。
 
附:
通过rename可以把原来字段名称还原回去。
alter table deployee rename column name to new_name;
alter table deployee rename column old_name to name;
重命名后结构如下:
create table DEPLOYEE
(
  ID       INTEGER,
  NAME     VARCHAR2(10),
  ID_CARD  VARCHAR2(20),
  NEW_NAME VARCHAR2(20)
)
 

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

请登录后发表评论 登录
全部评论
鱼儿的学习空间

注册时间:2010-11-16

  • 博文量
    433
  • 访问量
    1863773