【问题标题】:Add partition to table将分区添加到表
【发布时间】:2026-01-10 12:55:01
【问题描述】:

我创建了一个表并尝试在其上添加一个分区,但它失败并出现错误无效数据类型。

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"

这里有什么问题吗?提前致谢。

【问题讨论】:

  • 您创建了一个“普通”表,但是您必须创建一个分区表,请参阅这些示例Creating Partitions
  • 是的,但我想将分区添加到普通表中。
  • 是的,但除非您创建 redefinition,否则这是不可能的。但是,重新定义基本上意味着您创建一个新表,将数据从旧表复制到新表并删除旧表。

标签: oracle oracle11g partitioning database-partitioning


【解决方案1】:

正如@Wernfried Domscheit 指出的,您需要重新定义您的表格。对于现有的数据填充表,可以将以下块作为方法引用:

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

【讨论】:

    【解决方案2】:

    正如 Barbaros 所说,您不能将分区添加到未分区的表中。

    但是,有几种方法可以将非分区表转换为分区表。

    • 创建一个新的分区表,将现有表中的所有数据复制到这个新表中,删除旧表。请参阅 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。使用此功能,您可以将非分区表转换为另一个(分区)表的分区,反之亦然。

    【讨论】: