有时为了删除某个大数量量表上的某个字段,会采用先把这个字段设置为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/
,如需转载,请注明出处,否则将追究法律责任。