动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息



本月文章推荐
.vsftpd-1.1.3配制实例之五:VIRT.
.EXP错误(无效的列名).
.一些可以预见的Oracle应用程序性.
.oracle学习笔记(1)-数据备份与恢.
.使用PL/SQL从数据库中读取BLOB对.
.[Oracle 10g] 大文件表空间.
.Oracle 9i新特性研究四(延续性初.
.Oracle导出数据库结构到PowerDes.
.在Oracle数据库上构建.NET应用程.
.理解和使用Oracle 8i分析工具-L.
.Linux Shadow-Password-HOWTO.
.Qmail如何把该本地传送的邮件投递.
.ORACLE在HP-UX下的系列问题处理(.
.在非归档模式下如何更改数据文件.
.DBA应当如何查看Oracle数据库连接.
.Oracle查询中rownum与Order by查.
.ORACLE SQL性能优化系列 (十四) .
.Tom‘s New book has landed.
.ORACLE SQL性能优化系列(四).
.Function怎么返回一个数据集?.

实例讲解如何更改字段至兼容的不同类型

发表日期:2008-4-3 |


在实际的工作和学习中,我们可能由于疏忽将一个字段定义为varchar2类型,后来插入里面的数据又都是数字,在此之后,你会突然发现这个字段确实应该为number类型,而此时如果我们想在不影响用户使用的前提下,或者说尽量小的影响用户,保证数据不丢失的情况下,来更改这个数据类型,这个时候如果我们用普通的alter table modify命令,就可能要遇到错误了。示例如下:

22:25:31 SQL> select * from t;

A

----------

10

22:25:32 SQL> desc t

名称 是否为空? 类型

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

A VARCHAR2(10)

22:25:34 SQL> alter table t modify(a number);

alter table t modify(a number)

*

第 1 行出现错误:

ORA-01439: 要更改数据类型, 则要修改的列必须为空

其实,类似的现象确实很多,如本来应该为date类型,结果被定义成varchar2类型等等,主要就是那些兼容的数据类型之间的转换定义。当然,为什么一开始会犯这样的错误,那可能原因就有多方面了,如一开始需求就不对等等。

下面,以上面那个例子为基础,介绍两种处理这种问题的方法。

第一种方法,通过增加列来完成

22:25:44 SQL> alter table t add (b number);

表已更改。

22:34:16 SQL> update t set b = to_number(a)

已更新 1 行。

22:34:39 SQL> update t set a = null;

已更新 1 行。

22:34:50 SQL> commit;

提交完成。

22:34:52 SQL> select * from t;

A B

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

10

22:34:55 SQL> alter table t modify a number

表已更改。

22:35:21 SQL> update t set a=b;

已更新 1 行。

已用时间: 00: 00: 00.01

22:35:33 SQL> commit;

提交完成。

22:35:52 SQL> alter table t drop column b;

表已更改。

在这种方法中最后也可以先drop column a,然后rename column b to a,达到的效果是一样的。

第二种方法:通过新建表,在新表上更改字段,最后rename新表来完成

22:41:44 SQL> create table t1 as select * from t where 1=2;

表已创建。

22:42:14 SQL> alter table t1 modify (a number);

表已更改。

22:42:24 SQL> insert into t1 select * from t;

已创建 1 行。

22:42:37 SQL> commit;

提交完成。

22:42:40 SQL> drop table t;

表已删除。

22:42:46 SQL> rename t1 to t;

表已重命名。

22:43:00 SQL> desc t;

名称 是否为空? 类型

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

A NUMBER

我就知道这两种常见的方法,不知道还有没有什么其他的好方法。如果有,请分享。建议使用第一种。

约束和索引都被摧残了,可以做个实验证明一下。

先建立测试表并插入数据

15:28:45 SQL> create table t (a varchar2(10) not null);

表已创建。

已用时间: 00: 00: 00.03

15:28:47 SQL> insert into t values ('10');

已创建 1 行。

已用时间: 00: 00: 00.00

15:28:55 SQL> commit;

提交完成。

已用时间: 00: 00: 00.00

然后增加一个列,并且把数据复制过去

15:29:08 SQL> alter table t add (b number);

表已更改。

已用时间: 00: 00: 00.01

15:29:31 SQL> update t set b=to_number(a);

已更新 1 行。

已用时间: 00: 00: 00.01

15:29:42 SQL> commit;

提交完成。

已用时间: 00: 00: 00.00

15:29:45 SQL> alter table t modify b not null;

表已更改。

已用时间: 00: 00: 00.10

在原来的列上建立索引和约束

15:29:59 SQL> create index ind_t_a on t(a);

索引已创建。

已用时间: 00: 00: 00.15

15:31:01 SQL> alter table t add constraint uk_t_a unique(a);

表已更改。

已用时间: 00: 00: 00.03

斗转星移:

15:31:20 SQL> alter table t drop column a;

表已更改。

已用时间: 00: 00: 01.20

15:32:06 SQL> alter table t rename column b to a;

表已更改。

已用时间: 00: 00: 00.03

查看索引是否还在?可以看到索引已经被损坏了:

15:33:17 SQL> select index_name,status from user_indexes where table_name='T';

未选定行

已用时间: 00: 00: 00.12

15:34:20 SQL> select index_name,status from user_indexes order by 1;

INDEX_NAME STATUS

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

PK_DEPT VALID

PK_EMP VALID

已用时间: 00: 00: 00.35

然后查看约束是否还在?可以看到它也被摧残了

15:38:07 SQL> select constraint_name,constraint_type,invalid,table_name from user_constraints where table_name='T';

CONSTRAINT_NAME CONSTRAINT_TYPE INVALID TABLE_NAME

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

SYS_C005423 C T

已用时间: 00: 00: 00.03

15:38:24 SQL> select constraint_name,constraint_type,invalid,table_name from user_constraints;

CONSTRAINT_NAME CONSTRAINT_TYPE INVALID TABLE_NAME

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

BIN$lNdA2W97SK69TBAu945o7w==$0 C BIN$W9ZnSgtTS9+Fs/438TqKuA==$0

BIN$6JXde6KdTsum1GYM3py1eg==$0 C BIN$W9ZnSgtTS9+Fs/438TqKuA==$0

SYS_C005423 C T

FK_DEPTNO R EMP

PK_DEPT P DEPT

PK_EMP P EMP

已选择6行。

已用时间: 00: 00: 00.23

验证后,唯一约束已经不起作用了

15:38:31 SQL> select * from t;

A

----------

10

已用时间: 00: 00: 00.03

15:39:26 SQL> desc t;

名称 是否为空? 类型

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

A NOT NULL NUMBER

15:39:29 SQL> insert into t values(10);

已创建 1 行。

已用时间: 00: 00: 00.01

15:39:38 SQL> commit;

提交完成。

已用时间: 00: 00: 00.00

15:39:44 SQL> select * from t;

A

----------

10

10

可能大家会问,为什么还有一个C约束呢?上面的查询显示它是not null约束:

15:51:06 SQL> select table_name,constraint_name,column_name from user_cons_columns where table_name='T';

TABLE_NAME CONSTRAINT_NAME COLUMN_NAME

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

T SYS_C005423 A

16:09:29 SQL> select search_condition from user_constraints where table_name='T';

SEARCH_CONDITION

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

"A" IS NOT NULL

上一篇:Oracle用户密码含有特殊字符应当如何处理 人气:935
下一篇:在Oracle 10g中如何解决ORA-19815错误 人气:718
浏览全部ORACLE的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-23 Menalto Gallery v2.3 Rc1 多国语
2008-7-23 深度学习网址导航系统 v2.6.1
2008-7-23 因特达crm2008客户关系管理系统
2008-7-23 60度 CMS v1.0 Build 080723
2008-7-23 幻影动漫网视频系统(Ppdong) v1.
2008-7-23 好易祝福墙 2008
2008-7-23 APJE私服发布系统 v2.0 PHP版
2008-7-23 毕业论文在线指导系统源码
2008-7-23 Jacky法律在线网站源码
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵