将分区添加到 table
Add partition to table
我创建了一个 table 并试图在其上添加一个分区,但它失败了,错误是无效数据类型。
drop table test;
create table test (id number , h_date date);
ALTER TABLE TEST ADD PARTITION BY RANGE ("h_date") INTERVAL(NUMTODSINTERVAL(1,'DAY'))
(PARTITION "P20120101" VALUES LESS THAN (TO_DATE(' 2012-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')))
PARALLEL 4
PCTFREE 10;
错误:
Error report -
SQL Error: ORA-00902: invalid datatype
00902. 00000 - "invalid datatype"
这里有什么问题吗?提前致谢。
正如@Wernfried Domscheit 指出的那样,您需要重新定义 table。对于现有的和数据填充的 table,以下块可能被引用为方法:
SQL> create table test(id number , h_date date);
Table created
SQL> insert all
2 into test values(1,date'2011-12-31')
3 into test values(1,date'2012-01-01')
4 into test values(1,date'2012-01-02')
5 select * from dual;
3 rows inserted
SQL> select *
2 from test;
ID H_DATE
---------- -----------
1 31.12.2011
1 01.01.2012
1 02.01.2012
SQL> create table test2
2 partition by range(h_date)
3 interval
4 (numtodsinterval(1,'day'))
5 (partition "P20120101" values less than(to_date('2012-01-01 00:00:00',
'yyyy-mm-dd hh24:mi:ss', 'NLS_CALENDAR=GREGORIAN')))
6 as
7 select * from test;
Table created
SQL> select *
2 from test2
3 partition("P20120101");
ID H_DATE
---------- -----------
1 31.12.2011
SQL> drop table test;
Table dropped
SQL> rename test2 to test;
Table renamed
正如 Barbaros 所述,您不能将分区添加到未分区的 table。
但是,有几种方法可以将非分区 table 转换为分区 table。
- 创建一个新的分区 table,将现有 table 中的所有数据复制到这个新的 table,删除旧的。请参阅 Barbaros 的回答以获取示例。
- 使用 DBMS_REDEFINITION 包。它不仅仅是一个命令,请转到文档以获取更多详细信息,或者如果您有相关问题,请在此处提出具体问题。
在 Oracle 12.2 版中引入了特性 Online Conversion of a Nonpartitioned Table to a Partitioned Table。有了这个功能,这将是一个简单的命令:
ALTER TABLE test MODIFY
PARTITION BY RANGE (h_date) INTERVAL (INTERVAL '1' DAY) (
PARTITION P20120101 VALUES LESS THAN (DATE '2012-01-01')
) ONLINE;
也许您正在寻找 Exchanging Partitions and Subpartitions。使用此函数,您可以将未分区的 table 转换为另一个(已分区的)table 的分区,反之亦然。
我创建了一个 table 并试图在其上添加一个分区,但它失败了,错误是无效数据类型。
drop table test;
create table test (id number , h_date date);
ALTER TABLE TEST ADD PARTITION BY RANGE ("h_date") INTERVAL(NUMTODSINTERVAL(1,'DAY'))
(PARTITION "P20120101" VALUES LESS THAN (TO_DATE(' 2012-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')))
PARALLEL 4
PCTFREE 10;
错误:
Error report -
SQL Error: ORA-00902: invalid datatype
00902. 00000 - "invalid datatype"
这里有什么问题吗?提前致谢。
正如@Wernfried Domscheit 指出的那样,您需要重新定义 table。对于现有的和数据填充的 table,以下块可能被引用为方法:
SQL> create table test(id number , h_date date);
Table created
SQL> insert all
2 into test values(1,date'2011-12-31')
3 into test values(1,date'2012-01-01')
4 into test values(1,date'2012-01-02')
5 select * from dual;
3 rows inserted
SQL> select *
2 from test;
ID H_DATE
---------- -----------
1 31.12.2011
1 01.01.2012
1 02.01.2012
SQL> create table test2
2 partition by range(h_date)
3 interval
4 (numtodsinterval(1,'day'))
5 (partition "P20120101" values less than(to_date('2012-01-01 00:00:00',
'yyyy-mm-dd hh24:mi:ss', 'NLS_CALENDAR=GREGORIAN')))
6 as
7 select * from test;
Table created
SQL> select *
2 from test2
3 partition("P20120101");
ID H_DATE
---------- -----------
1 31.12.2011
SQL> drop table test;
Table dropped
SQL> rename test2 to test;
Table renamed
正如 Barbaros 所述,您不能将分区添加到未分区的 table。
但是,有几种方法可以将非分区 table 转换为分区 table。
- 创建一个新的分区 table,将现有 table 中的所有数据复制到这个新的 table,删除旧的。请参阅 Barbaros 的回答以获取示例。
- 使用 DBMS_REDEFINITION 包。它不仅仅是一个命令,请转到文档以获取更多详细信息,或者如果您有相关问题,请在此处提出具体问题。
在 Oracle 12.2 版中引入了特性 Online Conversion of a Nonpartitioned Table to a Partitioned Table。有了这个功能,这将是一个简单的命令:
ALTER TABLE test MODIFY PARTITION BY RANGE (h_date) INTERVAL (INTERVAL '1' DAY) ( PARTITION P20120101 VALUES LESS THAN (DATE '2012-01-01') ) ONLINE;
也许您正在寻找 Exchanging Partitions and Subpartitions。使用此函数,您可以将未分区的 table 转换为另一个(已分区的)table 的分区,反之亦然。