Oracle修改表列名与顺序的解决方案

来源:互联网 发布:做广告图片的软件 编辑:程序博客网 时间:2024/06/05 04:59
在Oracle中创建表后,如果想修改表的定义可以使用alter table 命令,但是如果要修改列名或调整列的顺序时,alter table 命令将无能为力。当然可以使用原始办法,[ 通过create table 临时表 as select * from 源表 ],然后把原来的表删除,再重建,然后使用 [ insert into 新表 select 列1,列2 from 临时表 ] 就可以解决了,但是这样做需要有足够大的空间。
下面介绍通过修改数据字典的方法修改表的列名:
假设在 HR帐号下有EMP_COPY 表(ID,NAME,DID),现决定要修改为EMP_COPY(ID,DEPARTID,ENAME)
即修改列名与顺序。
步骤:
1. 在HR帐号下使用下面命令查询EMP_COPY对象的编号:
SQL>
1   select OBJECT_name,object_id from all_objects
2* where object_name='EMP_COPY'
SQL> /
OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
EMP_COPY                            50555
2.切换到sys帐号下
SQL> conn sys/password as sysdba;
Connected.
SQL> select obj#,col#,name from col$
2 where obj#=50555;
      OBJ#       COL# NAME
---------- ---------- ----------------------------
     50555          1 ID
     50555          2 NAME
     50555          3 DID
Elapsed: 00:00:00.03
SQL>
3. 下面可以通过修改这个系统表来实现修改列名与顺序,注意,COL#就是列的顺序。
UPDATE COL$ SET COL#=2,name='DEPARTID'
WHERE OBJ#=50555 and name='DID';
UPDATE COL$ SET COL#=3,name='ENAME'
WHERE OBJ#=50555 and name='NAME'
4. 再次查询
SQL> select obj#,col#,name from col$
2 where obj#=50555;
      OBJ#       COL# NAME
---------- ---------- ------------------------------
     50555          1 ID
     50555          3 ENAME
     50555          2 DEPARTID
5. 提交修改
SQL>commit ;
6. 重启服务
SQL> SHUTDOWN IMMEDIATE
SQL>STARTUP
7. 登录HR,查询SELECT * FROM EMP_COPY;
SQL> desc emp_copy;
Name                  
-----------------------
ID                    
DEPARTID                  
ENAME