在数据字典中直接修改Oracle表列名

原创 2004年06月23日 09:31:00

Oracle数据库没有提供直接修改表中列名称的功能,但在实际使用时常需要修改表的列名和列顺序,不得已有些Oracle的使用人员用重新创建一个新的具有正确列名和顺序的数据库表,再将旧表的数据转储进来,最后删除旧表并将新表重命名为旧表的方法来完成此功能。此方法的最大问题是要求有双倍的存储空间、较大的回滚段和较长的时间,如果表中数据量较大,这项工作开销会很大。实际上我们可以从数据字典中直接修改表列的名称和顺序。下面是具体的实现步骤:

1.以internal用户名登录Oracle数据库,并创建一测试表。

SQL>CREATE TABLE SCOTT.TEST AS SELECT EMPNO,ENAME FROM SCOTT.EMP;

SQL>DESC SCOTT.TEST

Name Type Nullable Default Comments

------- ------------ -------

EMPNO NUMBER(4) Y

ENAME VARCHAR2(10) Y

下面我们要把SCOTT.TEST表中EMPNO和ENAME两列调换顺序,并把ENAME列更名为EMP_NAME,EMPNO改为EMP_NO。

2.查询表中列的实际存储位置或表。

SQL>SET LONG 9999

由于TEXT列是LONG类型,只有“SET”之后才能完全显示。

SQL>SELECT TEXT FROM ALL_VIEWS WHERE VIEW_NAME = ‘USER_TAB_COLUMNS’;

数据字典视图USER_TAB_COLUMNS中存储有表列的定义信息,从该语句的查询结果可以看出,列定义信息是存储在表SYS.COL$中的,即如果修改表中列的定义,应该在SYS.COL$表中修改。

3.从数据字典视图ALL_OBJECTS中查找对象SCOTT.TEST对象ID。

SQL> SELECT * FROM ALL_OBJECTS WHERE OWNER =‘SCOTT’ AND OBJECT_NAME=‘TEST’;

4.根据SCOTT.TEST对象的ID,从SYS.COL$检索出表中列的定义信息。

SQL> SELECT OBJ#,COL#,NAME FROM SYS.COL$ WHERE OBJ# =13888;

OBJ# COL# NAME

---------- ---------- -------

13888 1 EMPNO

13888 2 ENAME

5.使用Update语句来进行修改。

UPDATE SYS.COL$ SET COL# = 2,NAME=‘EMP_NO’ WHERE OBJ# = 13888 AND NAME=‘EMPNO’;

UPDATE SYS.COL$ SET COL# = 1,NAME=‘EMP_NAME’ WHERE OBJ# = 13888 AND NAME =‘ENAME’;

COMMIT;

6. 重启数据库服务。

由于数据字典是在数据库启动时加载到SQL中的,所以修改了它之后,如果使用“SELECT * FROM SCOTT.TEST; ”,会发现好像并没有修改。因此,修改完成之后,还需要重启数据库服务。

SQL>SHUTDOWN

SQL>STARTUP

这时,再查看,就会发现修改已经成功。

SQL> SELECT * FROM SCOTT.TEST;

EMP_NAME EMP_NO

---------- ------

SMITH 7369

ALLEN 7499

WARD 7521

……

这种方法直接从数据库中进行表列定义的修改,存在一定风险,但它对于数据量特别大的表是非常有用的。充分利用数据字典功能,往往能够完成日常很难完成的工作

oracle常用数据字典和SQL语句总结

一、Oracle数据字典   数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的。比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等。当用户在对数据库中...
  • u014057054
  • u014057054
  • 2016年08月18日 17:19
  • 10548

oracle怎样修改表名、列名、字段类型、添加表列、删除表列

ALTER TABLE SCOTT.TEST RENAME TO TEST1--修改表名 ALTER TABLE SCOTT.TEST RENAME COLUMN NAME TO NAME1 -...
  • z69183787
  • z69183787
  • 2013年11月25日 16:01
  • 1923

oracle数据字典等常用查询操作

1、查询表操作 各个权限的表: 其中表有三个权限的视图, select count(*) from dba_tables; select count(*) from dba_objects wher...
  • jc_benben
  • jc_benben
  • 2017年03月01日 16:06
  • 1408

MySQL修改表列名

京东2016实习生招聘 Java开发工程师 在MySql中,如果要修改表的列名,下列语句的语法正确的是 A ALTER TABLE 表名字 CHANGE 列名称 新列名称 B ALTE...
  • xhyxxx
  • xhyxxx
  • 2017年03月19日 14:11
  • 2806

Oracle中数据字典和数据类型

一、数据字典 1.查询某用户下的所有表 select table_name from all_tables where owner='SCOTT'; --用户名需要大写 2.查询表中所有的字段 sel...
  • smile_from_2015
  • smile_from_2015
  • 2016年12月02日 17:09
  • 699

从数据字典中查询存储过程, 函数, 包

--查询存储过程 --select * from user_source order by name; clear; select * from user_source where name...
  • dingdangxiaoma
  • dingdangxiaoma
  • 2010年06月04日 20:29
  • 1151

Oracle常用系统数据字典表、系统包功能分类

查看表:user_tables、all_tables、dba_tables 查看表字段:user_tab_columns、all_ tab_columns、dba_tab_columns ...
  • demonson
  • demonson
  • 2016年11月16日 18:10
  • 1075

Oracle数据库(数据字典、表空间、表的创建、视图)

Oracle之数据字典、表空间、表的操作、视图
  • u013412772
  • u013412772
  • 2016年10月04日 14:30
  • 3159

在ORACLE中获取表名和列名

查看當前用戶下的表: select * from tab select * from cat select * from user_tables 查看所有的表: select * fro...
  • my2010Sam
  • my2010Sam
  • 2014年03月11日 14:26
  • 1445

Oracle数据字典 和 查询表中字段的注释方法

Java 获取 表的属性 可以通过ResultSetMetaData接口那么 有没有办法 获取表中某个字段的 注释? select comments   from USER_COL_COMM...
  • yaov_yy
  • yaov_yy
  • 2013年06月24日 10:26
  • 2585
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在数据字典中直接修改Oracle表列名
举报原因:
原因补充:

(最多只允许输入30个字)