INTERVAL分区其实是一种比较特殊的范围分区,因此可以很方便的将RANGE分区表转化为INTERVAL分区表,同样可以将INTERVAL分区表转化为RANGE分区表。
对于一个普通的范围分区表:
SQL> CREATE TABLE T_PART
2 (ID NUMBER,
3 NAME VARCHAR2(30),
4 CREATE_DATE DATE)
5 PARTITION BY RANGE (ID)
6 (PARTITION P1 VALUES LESS THAN (100),
7 PARTITION P2 VALUES LESS THAN (200),
8 PARTITION P3 VALUES LESS THAN (300));
表已创建。
SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL
2 FROM USER_PART_TABLES
3 WHERE TABLE_NAME = 'T_PART';
TABLE_NAME PARTITION INTERVAL
------------------------------ --------- ----------------------------------------
T_PART RANGE
SQL> INSERT INTO T_PART
2 VALUES (100, 'A', SYSDATE);
已创建1行。
SQL> INSERT INTO T_PART
2 VALUES (240, 'A', SYSDATE);
已创建1行。
SQL> INSERT INTO T_PART
2 VALUES (360, 'TEST', SYSDATE);
INSERT INTO T_PART
*
第1行出现错误:
ORA-14400:插入的分区关键字未映射到任何分区
插入超过分区上限的记录会报错,下面通过一个简单ALTER TABLE语句,将RANGE分区表转化为INTERVAL分区表:
SQL> ALTER TABLE T_PART SET INTERVAL (100);
表已更改。
SQL> SELECT TABLE_NAME, PARTITIONING_TYPE, INTERVAL
2 FROM USER_PART_TABLES
3 WHERE TABLE_NAME = 'T_PART';
TABLE_NAME PARTITION INTERVAL
------------------------------ --------- ----------------------------------------
T_PART RANGE 100
SQL> INSERT INTO T_PART
2 VALUES (360, 'TEST', SYSDATE);
已创建1行。
SQL> COMMIT;
提交完成。
SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME = 'T_PART';
TABLE_NAME PARTITION_NAME HIGH_VALUE
------------------------------ ------------------------------ ----------------------
T_PART P1 100
T_PART P2 200
T_PART P3 300
T_PART SYS_P97 400
对于INTERVAL分区表,新增的超过分区上限的数据会自动导致对应的INTERVAL分区被建立。
同样INTERVAL分区表可以方便的转化为RANGE分区表,只需要不输入INTERVAL的值即可:
SQL> ALTER TABLE T_PART SET INTERVAL ();