在线重定义更改主键字段类型/ORA-23539

原创 2012年03月24日 23:15:44

SQL> create table T1 (x varchar2(20) primary key);
----主键类型是char型



Table created.


SQL> insert into t1 select object_id from all_objects;


71032 rows created.


SQL> commit;


Commit complete.


SQL> desc t1;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                         NOT NULL VARCHAR2(20)

-----要转换为number型
SQL> create table T2 (x number(20) primary key);


Table created.


SQL> desc t2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                         NOT NULL NUMBER(20)

----使用pk来检查,通过的
SQL> exec dbms_redefinition.can_redef_table('clm','t1',DBMS_REDEFINITION.CONS_USE_PK);


PL/SQL procedure successfully completed.

但是进行star重定义的时候报错
SQL> exec dbms_redefinition.start_redef_table('clm','T1','T2','to_number(x) x', dbms_redefinition.cons_use_pk);
BEGIN dbms_redefinition.start_redef_table('clm','T1','T2','to_number(x) x', dbms_redefinition.cons_use_pk); END;


*
ERROR at line 1:
ORA-42008: error occurred while instantiating the redefinition
ORA-12016: materialized view does not include all primary key columns
ORA-06512: at "SYS.DBMS_REDEFINITION", line 52
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646
ORA-06512: at line 1



----然后想直接使用rowid来重定义报错
SQL> exec dbms_redefinition.start_redef_table('clm','T1','T2','to_number(x) x', dbms_redefinition.cons_use_rowid);
BEGIN dbms_redefinition.start_redef_table('clm','T1','T2','to_number(x) x', dbms_redefinition.cons_use_rowid); END;


*
ERROR at line 1:
ORA-23539: table "CLM"."T1" currently being redefined
ORA-06512: at "SYS.DBMS_REDEFINITION", line 52
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1646
ORA-06512: at line 1



然后在使用rowi检查时候可以重定义----结果也报错
SQL> exec dbms_redefinition.can_redef_table('clm','t1',DBMS_REDEFINITION.CONS_USE_rowid);
BEGIN dbms_redefinition.can_redef_table('clm','t1',DBMS_REDEFINITION.CONS_USE_rowid); END;


*
ERROR at line 1:
ORA-23539: table "CLM"."T1" currently being redefined
ORA-06512: at "SYS.DBMS_REDEFINITION", line 139
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1782
ORA-06512: at line 1




SQL> show user;
USER is "CLM"
SQL> desc t1;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                         NOT NULL VARCHAR2(20)


SQL> execute dbms_redefinition.abort_redef_table('clm','t1','t2');
----需要停掉改过程重新来才行

PL/SQL procedure successfully completed.

SQL> exec dbms_redefinition.can_redef_table('clm','t1',DBMS_REDEFINITION.CONS_USE_rowid);


PL/SQL procedure successfully completed.


SQL> exec dbms_redefinition.start_redef_table('clm','T1','T2','to_number(x) x', dbms_redefinition.cons_use_rowid);


PL/SQL procedure successfully completed.


SQL> select count(*) from t1;


  COUNT(*)
----------
     71032


SQL> select count(*) from t2;


  COUNT(*)
----------
     71032


SQL> delete from t1 where rownum<20;


19 rows deleted.


SQL> commit;


Commit complete.


SQL> select count(*) from t1;


  COUNT(*)
----------
     71013


SQL> select count(*) from t2;


  COUNT(*)
----------
     71032


SQL> exec dbms_redefinition.sync_interim_table('clm', 'T1', 'T2');


PL/SQL procedure successfully completed.


SQL>  select count(*) from t2;


  COUNT(*)
----------
     71013


SQL> exec dbms_redefinition.finish_redef_table('clm','T1','T2');


PL/SQL procedure successfully completed.


SQL> desc t1;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                         NOT NULL NUMBER(20)


SQL> desc t2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                         NOT NULL VARCHAR2(20)


SQL> 
成功交换

定义数据表时一定要记得定义主键

在使用sqlAdapter组件的时候曾经发现VS不会自动帮我们生成Insert,Update和Delete的SQL语句,起初还以为是VS的Bug,后来别人提醒说可能是没有定义主键,当数据表没有主键的时...
  • juliaugong
  • juliaugong
  • 2004年12月06日 00:31
  • 715

主键设计用什么字段类型比较好?

主键的必要性:  有些朋友可能不提倡数据库表必须要主键,但在我的思考中,觉得每个表都应该具有主键,不管是单主键还是双主键,主键的存在就代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要...
  • u013715683
  • u013715683
  • 2014年02月20日 14:52
  • 2203

使用ORACLE在线重定义将普通表改为分区表

1.首先建立测试表,并插入测试数据:create table myPartition(id number,code varchar2(5),identifier varchar2(20)); inse...
  • fz2543122681
  • fz2543122681
  • 2015年08月30日 15:27
  • 3639

Oracle在线重定义DBMS_REDEFINITION 普通表—>分区表

转载至http://www.cnblogs.com/jyzhao/p/3876634.html 实验环境:RHEL 6.4 + Oracle 11.2.0.3 实验:在线重定义 普通表 为...
  • vic_qxz
  • vic_qxz
  • 2016年10月22日 17:32
  • 347

Oracle增加修改删除字段/主键

修改字段名称alter table xgj rename column old_name to new_name;修改字段类型alter table tablename modify (colum...
  • yangshangwei
  • yangshangwei
  • 2016年11月04日 23:20
  • 7936

ORACLE表的在线重定义

一、在线表重定义的用处: 1、修改表或者簇的存储参数 2、在相同schema的表空间之间,可以移动表或簇 注意:如果表的可以停止dml操作,则可以利用alter table move来进行表空间的更改...
  • u013428681
  • u013428681
  • 2014年01月13日 18:28
  • 1223

ORACLE定义长度的数据类型

 CLOB和BLOB都是4G,而LONG ,LONG raw是旧时代的oracle二进制和长文本表示,将来会被废弃。最长长度是2G. 单位是Byte 表中单个 LOB 字段 在 9i  版本...
  • qin_yaping
  • qin_yaping
  • 2016年11月07日 10:53
  • 1890

Oracle中distinct的用法实例以及Oracle distince 用法和删除重复数据

Oracle中distinct的用法实例 摘要: 此外,distinct 会对返回的结果集进行排序 所以会大大影响查询效率,大数据集时比较明显 。所以,最好和order by 结合使用,可以提高效...
  • haiross
  • haiross
  • 2013年12月05日 11:38
  • 58981

oracle 重定义表

摘自:http://blog.csdn.net/edcvf3/article/details/8721655 ORACLE数据库支持在线(不关库)修改表的各种物理属性和逻辑属性,包括...
  • xuelanggongwu
  • xuelanggongwu
  • 2013年06月08日 14:41
  • 1327

oracle 在线重定义

在线重定义功能 步骤: SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); 表已创建。 SQL> INSERT INTO T...
  • a545578125
  • a545578125
  • 2014年01月13日 14:09
  • 487
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在线重定义更改主键字段类型/ORA-23539
举报原因:
原因补充:

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