http://hb-keepmoving.iteye.com/blog/804297
Oracle 10g 修改表列名与顺序的解决方案- 下面介绍通过修改数值字典的方法修改表的列名:
假设在 SCOTT帐号下有HB_TEST 表:
--------------------------------------------------------------------
--目的:调换STU_ID和STU_NAME的顺序;并把STU_ID 改为S_ID;
SQL>SELECT * FROM HB_TEST;
/**
STU_ID STU_NAME CRO_NAME GRADE
---------- ---------- ---------- ----------
1 张三 语文 68
2 李四 语文 88
3 王五 语文 72
4 小张 语文 65
1 张三 数学 90
2 李四 数学 62
3 王五 数学 94
4 小张 数学 75
1 张三 物理 50
2 李四 物理 60
3 王五 物理 70
4 小张 物理 80
*/
--第一步:
SQL>select OBJECT_name,object_id from all_objects
2 where object_name='HB_TEST';
/**
OBJECT_NAME OBJECT_ID
------------------------------ ----------
HB_TEST 49214
*/
--第二步:切换到sys帐号下
SQL>conn / as sysdba;
--第三步:
SQL>select obj#,col#,name from col$ where obj#=49214;
/**
OBJ# COL# NAME
---------- ---------- ----------
49214 1 STU_ID
49214 2 STU_NAME
49214 3 CRO_NAME
49214 4 GRADE
*/
--第四步: 下面可以通过修改这个系统表来使成为事实修改列名与顺序,注意,COL#就是列的顺序。
SQL>UPDATE COL$ SET COL#=2,name='S_ID'
2 WHERE OBJ#=49214 and name='STU_ID';
/**
OBJ# COL# NAME
--------- ---------- ---------
49214 2 S_ID
49214 2 STU_NAME
49214 3 CRO_NAME
49214 4 GRADE
*/
--再更新STU_NAME 的col# 的值;
SQL>UPDATE COL$ SET COL#=1,name='STU_NAME'
2 WHERE OBJ#=49214 and name='STU_NAME';
--第五步:再次查询
SQL>select obj#,col#,name from col$ where obj#=49214;
/**
OBJ# COL# NAME
--------- ---------- --------
49214 2 S_ID
49214 1 STU_NAME
49214 3 CRO_NAME
49214 4 GRADE
*/
--第六步:提交修改
SQL>commit;
--第七步: 重启服务
SQL>SHUTDOWN IMMEDIATE; --关闭
SQL>STARTUP; --开启
--第八步:登录SCOTT账号,查询
SQL>SELECT * FROM HB_TEST;
/**
STU_NAME S_ID CRO_NAME GRADE
---------- ---------- ---------- ----------
张三 1 语文 68
李四 2 语文 88
王五 3 语文 72
小张 4 语文 65
张三 1 数学 90
李四 2 数学 62
王五 3 数学 94
小张 4 数学 75
张三 1 物理 50
李四 2 物理 60
王五 3 物理 70
小张 4 物理 80
*/
--第九步:查看表结构
SQL>desc HB_TEST;
/**
名称
--------------
STU_NAME
S_ID
CRO_NAME
GRADE
*/
--------------------------------------------------------------------
还有一种方法:
如果创建表好了后,想修改表的定义可以使用alter table 命令,但是如果要修改列名或调整列的顺序时,alter table 命令将无能为力。当然可以使用原始措施,通过(create table 临时表 as select * from 源表),之后把原来的表删除,再重修,之后使用 (insert into 新表 select 列1,列2 from 临时表 ) 就能够处理完成了,但是这样做需要有足够大的空间。