Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1733950
  • 博文数量: 163
  • 博客积分: 10591
  • 博客等级: 上将
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-08 18:17
文章分类

全部博文(163)

文章存档

2018年(1)

2012年(1)

2011年(47)

2010年(58)

2009年(21)

2008年(35)

分类: Oracle

2010-11-18 16:11:02

在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          
阅读(3115) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-19 15:18:38

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com