Oracle 如何修改列的数据类型
2015-10-19 23:11
417 查看
【原】Oracle 如何修改列的数据类型
作者:david_zhang@sh 【转载时请以超链接形式标明文章】链接:http://www.cnblogs.com/david-zhang-index/archive/2012/04/10/2441015.html
对字段操作 | 操作方法 |
更新字段名 | alter table TABLE_NAME rename column column_old to column_new; |
添加字段 | alter table TABLE_NAME add COLUMN_NAME varchar(10); |
删除字段 | alter table TABLE_NAME drop column COLUMN_NAME; |
添加字段并附值 | alter table TABLE_NAME ADD COLUMN_NAME NUMBER(1) DEFAULT 1; |
修改字段值 | update TABLE_NAME set filedname=value where filedname=value; |
修改字段数据类型 | alter table tablename modify filedname varchar2(20); |
1 SQL> select * from v$version; 2 3 BANNER 4 -------------------------------------------------------------------------------- 5 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 6 PL/SQL Release 11.2.0.1.0 - Production 7 CORE 11.2.0.1.0 Production 8 TNS for Linux: Version 11.2.0.1.0 - Production 9 NLSRTL Version 11.2.0.1.0 - Production1.修改字段数据类型时,如果该列有数据则报ORA-01439: column to be modified must be empty to change datatype,此时需要通过另外一种方法修改:
SQL> alter table zyt add id_temp varchar2(10); Table altered. SQL> commit; Commit complete. SQL> select * from zyt; NAME ID ID_TEMP ---------- ---------- ---------- zyt1 1 david 2 SQL> alter table zyt rename column id to id_bak; Table altered. SQL> select * from zyt; NAME ID_BAK ID_TEMP ---------- ---------- ---------- zyt1 1 david 2 SQL> desc zyt; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) ID_BAK NOT NULL NUMBER(2) ID_TEMP VARCHAR2(10) SQL> update zyt set ID_TEMP = cast(ID_BAK as varchar2(10)); 2 rows updated. SQL> commit; Commit complete. SQL> select * from zyt; NAME ID_BAK ID_TEMP ---------- ---------- ---------- zyt1 1 1 david 2 2 SQL> alter table zyt drop column ID_BAK; Table altered. SQL> commit; Commit complete. SQL> select * from zyt; NAME ID_TEMP ---------- ---------- zyt1 1 david 2 SQL> desc zyt; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) ID_TEMP VARCHAR2(10)备注:这种方法能满足需求,因新增字段默认添加到表末尾,有可能发生行迁移,对应用程序会产生影响,同时也涉及复杂数据,不算最好的方法
2.建立一个中间跳板,临时存储数据
SQL> desc zyt; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) ID VARCHAR2(10) SQL> select * from zyt; NAME ID ---------- ---------- zyt1 1 david 2 SQL> alter table zyt add id_temp VARCHAR2(10) Table altered. SQL> select * from zyt; NAME ID ID_TEMP ---------- ---------- ---------- zyt1 1 david 2 SQL> update zyt set ID_TEMP=id,id=null; 2 rows updated. SQL> select * from zyt; NAME ID ID_TEMP ---------- ---------- ---------- zyt1 1 david 2 SQL> alter table zyt modify id number(10); Table altered. SQL> desc zyt; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) ID NUMBER(10) ID_TEMP VARCHAR2(10) SQL> update zyt set id=ID_TEMP,ID_TEMP=null; 2 rows updated. SQL> select * from zyt; NAME ID ID_TEMP ---------- ---------- ---------- zyt1 1 david 2 SQL> alter table zyt drop column ID_TEMP; Table altered. SQL> commit; Commit complete. SQL> select * from zyt; NAME ID ---------- ---------- zyt1 1 david 2 SQL> desc zyt; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(10) ID NUMBER(10)备注:第二种方法,是增加一个与被修改的列类型一样的列,之后将要修改列的数据复制到新增的列并置空要修改的列,之后修改数据类型,再从新增列将数据拷贝回来,该过程涉及两次数据复制,如果是数据量很多,会比较慢同时也会产生很多undo和redo;优点是数据不会发生行迁移。
相关文章推荐
- oracle 数据库解锁
- 在oracle linux 6.7升级gcc,从4.4.7到5.2.0
- ORA- 12012 : err or on aut o execu te of job ORACLE_OCM. MGMT_CONFIG_JOB_2_1 ORA-29280: inval
- oracle之子查询、连接查询、递归查询
- python连接oracle
- Oracle函数之LAG与LEAD
- ORACLE EXECUTE IMMEDIATE 'DML' 不能自动提交COMMIT 'DDL'触发COMMIT
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)
- oracle 创建表空间,用户
- oracle11g dataguard中standby库文件坏块的修复过程
- Oracle左外连接、右外连接、全外连接
- oracle课堂收录-过程中的事务处理
- oracle课堂收录-默认值
- oracle课堂收录-参数
- Navicat_Premium连接Oracle_10g
- Oracle 数据泵导数据(expdp,impdp)
- Oracle 11G Active DataGuard(ADG)搭建配置过程
- Oracle 表空间及用户创建 sql 语句
- ORACLE 区间分区(Interval Partitioning)
- Centos 6: nginx+php+oracle安装配置