总结:
转换要求:普通表和分区表的列顺序、字段长度必须一致,否则转换报错ORA-14097;
普通表不能转换到组合分区中;
分区表无数据,普通表转换后普通表中无数据,数据全部转移到分区表中;
再次执行该命令,则将分区中数据转移回普通表中;
普通表和分区表都有数据,执行转换命令后,两表数据互换;
实验记录:
--测试普通分区转换为组合分区中一部分;
---创建范围-哈希组合分区
CREATE TABLE range_hash_example(
range_column_key int,
hash_column_key INT,
DATA VARCHAR2(20)
)
PARTITION BY RANGE(range_column_key)
SUBPARTITION BY HASH(hash_column_key) SUBPARTITIONS 2
(
PARTITION part_1 VALUES LESS THAN (10)
(SUBPARTITION part_1_sub_1,
SUBPARTITION part_1_sub_2,
SUBPARTITION part_1_sub_3
),
PARTITION part_2 VALUES LESS THAN (20)
(SUBPARTITION part_2_sub_1,
SUBPARTITION part_2_sub_2
)
);
select * from range_hash_example;
--drop table range_hash_example ;
--插入数据
insert into range_hash_example values (1,11,'111');
insert into range_hash_example values (2,12,'112');
insert into range_hash_example values (3,13,'113');
insert into range_hash_example values (4,14,'114');
insert into range_hash_example values (5,15,'111');
insert into range_hash_example values (6,16,'112');
insert into range_hash_example values (7,17,'113');
insert into range_hash_example values (8,18,'114');
insert into range_hash_example values (11,21,'2021');
insert into range_hash_example values (12,22,'2022');
insert into range_hash_example values (13,23,'2023');
insert into range_hash_example values (14,24,'2024');
commit;
--查看插入情况
select * from range_hash_example;
select * from range_hash_example partition (part_1);
select * from range_hash_example subpartition(part_1_sub_1);
select * from range_hash_example subpartition(part_1_sub_2);
select * from range_hash_example subpartition(part_1_sub_3);
--创建普通表
CREATE TABLE rangep1(
range_column_key int,
hash_column_key INT,
DATA VARCHAR2(20)
);
---插入数据
insert into rangep1 values (15,21,'2021');
insert into rangep1 values (16,22,'2022');
insert into rangep1 values (17,23,'2023');
insert into rangep1 values (18,24,'2024');
select * from rangep1;
---转换普通表为分区:
alter table range_hash_example exchange partition part_2 with table rangep1;
报错;
ORA-14291 不能用非分区表exchange分区表;
--truncate table rangep1;
--清除数据依然报错;
---创建范围分区
CREATE TABLE range_example(
range_column_key int,
hash_column_key INT,
DATA VARCHAR2(20))
PARTITION BY RANGE(range_column_key)
(PARTITION part_1 VALUES LESS THAN (10),
PARTITION part_2 VALUES LESS THAN (20));
select * from range_example;
--drop table range_example;
---插入数据
insert into rangep1 values (1,21,'2021');
insert into rangep1 values (1,22,'2022');
insert into rangep1 values (17,23,'2023');
insert into rangep1 values (18,24,'2024');
commit;
select * from rangep1;
---转换普通表为分区:
alter table range_example exchange partition part_2 with table rangep1;
---转换过去,没数据了;
select * from rangep1;
select * from range_example;
---插入数据
insert into rangep1 values (1,21,'2021');
insert into rangep1 values (1,22,'2022');
---再转换一次;
alter table range_example exchange partition part_1 with table rangep1;
select * from rangep1;
select * from range_example;
---再转换一次,part_1分区数据又回来了;
alter table range_example exchange partition part_1 with table rangep1;
select * from rangep1;
select * from range_example;
---插入数据,
insert into rangep1 values (2,21,'2021');
insert into rangep1 values (2,22,'2022');
---此时普通表和分区表都有数据;
select * from rangep1;
select * from range_example;
---再转换一次;
alter table range_example exchange partition part_1 with table rangep1;
---此时普通表和分区表中的数据作了交换;;
select * from rangep1;
select * from range_example;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29519108/viewspace-2148989/
,如需转载,请注明出处,否则将追究法律责任。