社区
基础和管理
帖子详情
在oracle中不能修改列名
jinchun
2003-06-24 11:35:28
在oracle中不能修改列名,是否一定要删除列后再新增列
...全文
376
3
打赏
收藏
在oracle中不能修改列名
在oracle中不能修改列名,是否一定要删除列后再新增列
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
things
2003-07-02
打赏
举报
回复
UP
beckhambobo
2003-07-02
打赏
举报
回复
不是说9i支持
asdf008
2003-07-02
打赏
举报
回复
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
……
这种方法直接从数据库中进行表列定义的修改,存在一定风险,但它对于数据量特别大的表是非常有用的。充分利用数据字典功能,往往能够完成日常很难完成的工作。下面笔者写了一段简单的存储过程,可实现表中列的重命名。读者可直接调用此过程来完成列的重命名:
SQL>exec altercolname(‘模式名称’,‘表名称’,‘原列名称’,‘新列名称’);
create or replace procedure sys.altercolname
(schmaname in varchar2,
tabname in varchar2,
oldcolname in varchar2,
newcolname in varchar2) is
n_schmaname varchar2(30); --模式名称
n_tablename varchar2(30); --表名称
n_oldcolname varchar2(30); --原来列名称
n_newcolname varchar2(30); --新的列名称
n_objnum number;
begin
n_schmaname := upper(schmaname);
n_tablename := upper(tabname);
n_oldcolname := upper(oldcolname);
n_newcolname := upper(newcolname);
SELECT OBJECT_ID INTO n_objnum
FROM ALL_OBJECTS
WHERE OWNER = n_schmaname
AND OBJECT_NAME=n_tablename;
UPDATE SYS.COL$
SET NAME=n_newcolname
WHERE OBJ# = n_objnum AND
NAME=n_oldcolname;
COMMIT;
end altercolname;
Oracle
通过DBLink操作Excel
Oracle
通过DBLink操作Excel连Excel非工业级应用,演示目的在于说明ODBC能连,Generic Connect都能连。1、创建数据库HRXL.xlsSheet1“DEPT”,字段及数据如下:DEPT_NO NAME1 Test2 Test2Sheet2“EMP”,字段及数据如下:EMP_NO NAME DEPT_NO1
Oracle
B树索引
Oracle
B树索引,创建,查看,修改,删除,注意事项
Oracle
中
修改表列名,用SQL语句的方式
alter table rename column to ; 注释: 9i 以下版本应该没有这条命令,9i以上不知道。 应该用新列名加一列,更新数据,删除旧列。 8i以下版本只能重新建表了: rename a to b; create table a (..,new_col_name,..) as select ..,old_col_name,..) fro
mysql怎么修改表的列名字_修改表列名-怎么修改数据库表的列名-mysql修改表的列名...
SQL
中
怎样修改一个表的列名呢??各个数据库不一样。
oracle
: ALTER TABLE 表名 RENAME COLUMN 列名 TO 新列名sqlserver:exec sp_rename '[表名].[列名]','[表名].[新列名]'mysql:ALTER TABLE 表名 CHANGE 列名 新列名 列类型sql 更改查询结果的列名用as就可以:select USERNAME,PASSW...
Oracle
中
修改表列名(SQL语句)
字段的操作 操作的方法(SQL)
修改列名
(更新字段) alter table 表名 rename column 原列名 to 新列名; 添加列 alter table 表名 add 列名 列类型; 删除列 alter table 表名 drop column 列名; 添加列并赋值 alter table 表名 add 列名 列类型 default 需...
基础和管理
17,377
社区成员
95,111
社区内容
发帖
与我相关
我的任务
基础和管理
Oracle 基础和管理
复制链接
扫一扫
分享
社区描述
Oracle 基础和管理
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章