oracle表在线重定义,Oracle的在线重定义表功能(二)

举个在线重定义使用的例子:

SQL> create table

test_primary (id number primary key);

表已创建。

SQL> insert into test_primary

select rownum from dba_objects;

已创建6264行。

SQL>

commit;

提交完成。

SQL> create table orgin_table

(id number, fid number, name varchar2(30), create_date

date)

2 tablespace

users;

表已创建。

SQL> insert into orgin_table

select rownum, rownum, object_name, created from

dba_objects

2 where owner =

'SYS';

已创建4034行。

SQL>

commit;

提交完成。

SQL> alter table orgin_table

add constraint pk_orgin_table primary key

(id);

表已更改。

SQL> create or replace

trigger tr_orgin_table

2 before insert on orgin_table

for each row

3 begin

4 null;

5 end;

6 /

触发器已创建

SQL> create index

ind_orgin_table_create_date on

orgin_table(create_date);

索引已创建。

SQL> alter table orgin_table

add constraint f_orgin_primary_id foreign key (fid)

2 references test_primary

(id);

表已更改。

SQL> begin

2 dbms_redefinition.can_redef_table('yangtk', 'orgin_table',

dbms_redefinition.cons_use_pk);

3 end;

4 /

PL/SQL

过程已成功完成。

SQL> create table

inter_table

2 (id number, fid number,

new_name varchar2(30), create_date date, comments

varchar2(1000))

3 tablespace yangtk

4 partition by range

(create_date)

5 (partition p1 values less

than (to_date('2005-1-1', 'yyyy-mm-dd')),

6 partition p2 values less

than (maxvalue));

表已创建。

SQL> alter table inter_table

add constraint pk_inter_table primary key

(id);

表已更改。

SQL> begin

2 dbms_redefinition.start_redef_table('yangtk', 'orgin_table',

'inter_table',

3 'ID ID, FID FID, NAME

NEW_NAME, CREATE_DATE CREATE_DATE, ''NO COMMENTS''

COMMENTS',

4 DBMS_REDEFINITION.CONS_USE_PK);

5 END;

6 /

PL/SQL

过程已成功完成。

SQL> SELECT COUNT(*) FROM

INTER_TABLE;

COUNT(*)

----------

4034

SQL> COL COMMENTS FORMAT

A20

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD

HH24:MI:SS';

会话已更改。

SQL> SELECT * FROM

INTER_TABLE WHERE ID = 1;

ID FID

NEW_NAME CREATE_DATE COMMENTS

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

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

1 1

ACCESS$ 2004-10-18 16:14:23 NO COMMENTS

SQL> INSERT INTO

ORGIN_TABLE

2 SELECT 4034+ROWNUM,

4034+ROWNUM, OBJECT_NAME, CREATED FROM DBA_OBJECTS

3 WHERE OWNER =

'SYSTEM';

已创建404行。

SQL>

COMMIT;

提交完成。

SQL> begin

2 dbms_redefinition.sync_interim_table('yangtk', 'orgin_table',

'inter_table');

3 end;

4 /

PL/SQL

过程已成功完成。

SQL> select count(*) from

INTER_TABLE;

COUNT(*)

----------

4438

SQL> alter table inter_table

add constraint fk_inter_primary_id foreign key (fid)

2 references test_primary (id)

disable;

表已更改。

SQL> create index

ind_inter_table_date on

inter_table(create_date);

索引已创建。

SQL> create index

ind_inter_table_fid on inter_table(fid);

索引已创建。

SQL> create or replace

trigger tr_inter_table

2 before insert on inter_table

for each row

3 begin

4 null;

5 end;

6 /

触发器已创建

SQL> begin

2 dbms_redefinition.finish_redef_table('yangtk', 'orgin_table',

'inter_table');

3 end;

4 /

PL/SQL

过程已成功完成。

SQL> desc

orgin_table

名称 是否为空? 类型

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

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

ID NOT NULL NUMBER

FID NUMBER

NEW_NAME VARCHAR2(30)

CREATE_DATE DATE

COMMENTS VARCHAR2(1000)

SQL> select table_name,

partition_name from user_tab_partitions where table_name =

'ORGIN_TABLE';

TABLE_NAME PARTITION_NAME

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

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

ORGIN_TABLE P1

ORGIN_TABLE P2

SQL> select table_name,

constraint_name, status from user_constraints

2 where table_name in

('ORGIN_TABLE', 'INTER_TABLE');

TABLE_NAME CONSTRAINT_NAME STATUS

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

INTER_TABLE PK_ORGIN_TABLE ENABLED

INTER_TABLE F_ORGIN_PRIMARY_ID DISABLED

ORGIN_TABLE PK_INTER_TABLE ENABLED

ORGIN_TABLE FK_INTER_PRIMARY_ID ENABLED

SQL> SELECT COUNT(*) FROM

ORGIN_TABLE;

COUNT(*)

----------

4438

SQL> SELECT COUNT(*) FROM

INTER_TABLE;

COUNT(*)

----------

4438

SQL> DROP TABLE

INTER_TABLE;

表已丢弃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值