在PL/SQL中,数据表A已经存在数据了
要求给A表创建按月自动分区,根据字段SJ(时间)来进行分区
做法:
1、首先创建一个A表的分区表B(创建分区表只能这样子创建)
CREATE TABLE B
PARTITION BY RANGE(SJ) INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITION SJ_1 VALUES LESS THAN(TO_DATE(' 2021-02-01 00:00:00','SYYYY-MM-DD HH24:MI:SS')) TABLESPACE A_DAT
)
AS SELECT * FROM A;
以上这个是按月自动分区;-- INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
按年:INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))
按日:INTERVAL(NUMTOYMINTERVAL(1,'DAY'))
按周:INTERVAL(NUMTODSINTERVAL (7, 'DAY'))
2、再将A表的名字给为C
ALTER TABLE A RENAME TO C;
3、将B表的名字改为A
ALTER TABLE B RENAME TO A;
4、将C(即原来的A表)的索引、注释、主键等数据结构同样添加到A(即分区表)表,最后删除C表即可。
这样就能得到创建好的自动分区表拉!
注意:
如果是这样创建(没+INTERVAL(NUMTOYMINTERVAL(1,'MONTH')),即是一个不会自动分区的分区表,当有新的数据进来(即sj大于2021-02-01 00:00:00的)就会报错ORA-14400: inserted partition key does not map to any partition(提示这个错误的时候说明,表结构没有对应的分区,所以插入不进去,解决方法就是创建新数据对应的分区段,或者将分区表改为按月自动分区表即可)
CREATE TABLE B
PARTITION BY RANGE(SJ)
(
PARTITION SJ_1 VALUES LESS THAN(TO_DATE(' 2021-02-01 00:00:00','SYYYY-MM-DD HH24:MI:SS')) TABLESPACE A_DAT,
PARTITION SJ_2 VALUES LESS THAN(TO_DATE(' 2021-03-01 00:00:00','SYYYY-MM-DD HH24:MI:SS')) TABLESPACE A_DAT
)
AS SELECT * FROM A;
当然如果不想用自动分区的话,也可以
方式一、
手动添加分区,针对注意里面创建的不自动分区表
添加分区:
ALTER TABLE A ADD PARTITION SJ_3 VALUES LESS THAN (TO_DATE(' 2021-03-01 00:00:00','SYYYY-MM-DD HH24:MI:SS')) TABLESPACE A_DAT;