ALTER TABLE. ADD SUBPARTITION命令用于添加子分区到现有的分区中,且这个分区必须已经进行了子分区的划分。

语法介绍

使用ALTER TABLE. ADD SUBPARTITION命令添加一个子分区到现有的包含子分区的分区中。语法如下:
ALTER TABLE table_name MODIFY PARTITION partition_name 
      ADD SUBPARTITION subpartition_definition;
其中 subpartition definition 是:
{list subpartition | range subpartition}
list subpartition 是:
SUBPARTITION [subpartition_name]
  VALUES (value[, value]...)
  [TABLESPACE tablespace_name]
range subpartition 是:
SUBPARTITION subpartition_name
  VALUES LESS THAN (value[, value]...) 
  [TABLESPACE tablespace_name]

描述

ALTER TABLE. ADD SUBPARTITION命令用于添加子分区到现有的分区中,且这个分区必须已经进行了子分区的划分。对于定义的子分区数量没有上限。

新的分区必须与现有分区的类型(LIST 或 RANGE)相同。新分区规则必须引用在(定义现有子分区的)子分区规则中指定的相同列。

您不能使用ALTER TABLE. ADD SUBPARTITION语句把分区添加到带有MAXVALUE或 DEFAULT规则的表中。但您可以用ALTER TABLE. SPLIT SUBPARTITION语句对现有子分区进行划分,有效地将子分区添加到表中。

您不能把新的子分区添加在范围子分区表中现有的子分区之前。 范围子分区必须以升序的方式指定。

包括TABLESPACE子句指定新的子分区要所属的表空间。如果您没有指定表空间, 那么子分区将创建于缺省表空间。

如果对表进行了索引设置, 那么索引将创建在新的子分区上。

要使用ALTER TABLE... ADD SUBPARTITION命令,您必须是表的拥有者或有超级用户(或管理员)的权限。

参数

参数 参数说明
table name 子分区要所属的分区表名称(可以采用模式限定的方式引用)。
partition name 新的子分区要所属的分区名称。
subpartition name 要创建的子分区名称。子分区名称在所有分区和子分区中必须是唯一的,且必须遵循给对象标识符命名的惯例。
(value[, value]...)

使用value来指定一个引用的文本值(或以逗号分隔的文本值列表)将表项目划分为不同的分区。每个分区规则必须至少指定一个值,但在规则中对于指定的值的数量没有上限要求。Value可能为null default (如果指定了一个list分区的话) 或 maxvalue (如果指定了一个range 分区的话)。

更多关于创建default maxvalue分区的信息请参见在LIST 或 RANGE 分区表中处理偏离值

tablespace name 子分区所属的表空间名称。

添加子分区到LIST-RANGE分区表示例

下列示例添加了一个RANGE子分区到列表分区表sales中。表sales是通过下列命令创建的:
CREATE TABLE sales
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY LIST(country)
  SUBPARTITION BY RANGE(date)
(
  PARTITION europe VALUES('FRANCE', 'ITALY')
    (
      SUBPARTITION europe_2011 
        VALUES LESS THAN('2012-Jan-01'),
      SUBPARTITION europe_2012 
        VALUES LESS THAN('2013-Jan-01')
    ),
  PARTITION asia VALUES('INDIA', 'PAKISTAN')
    (
      SUBPARTITION asia_2011 
        VALUES LESS THAN('2012-Jan-01'),
      SUBPARTITION asia_2012 
        VALUES LESS THAN('2013-Jan-01')
    ),
  PARTITION americas VALUES('US', 'CANADA')
    (
      SUBPARTITION americas_2011 
        VALUES LESS THAN('2012-Jan-01'),
      SUBPARTITION americas_2012 
        VALUES LESS THAN('2013-Jan-01')
    )
);
表sales有三个分区,分别为europe、 asia 和 americas。每个分区都有两个范围定义的子分区:
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
 partition_name | subpartition_name |  high_value   
----------------+-------------------+---------------
 europe         | europe_2011       | '2012-Jan-01' 
 europe         | europe_2012       | '2013-Jan-01' 
 asia           | asia_2011         | '2012-Jan-01' 
 asia           | asia_2012         | '2013-Jan-01' 
 americas       | americas_2011     | '2012-Jan-01' 
 americas       | americas_2012     | '2013-Jan-01' 
(6 rows)
下列命令添加了名为europe_2013的子分区:
ALTER TABLE sales MODIFY PARTITION europe 
  ADD SUBPARTITION europe_2013 
  VALUES LESS THAN('2015-Jan-01');
在调用命令这个命令之后,表包括了子分区europe_2013:
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
 partition_name | subpartition_name |  high_value   
----------------+-------------------+---------------
 europe         | europe_2011       | '2012-Jan-01' 
 europe         | europe_2012       | '2013-Jan-01' 
 europe         | europe_2013       | '2015-Jan-01' 
 asia           | asia_2011         | '2012-Jan-01' 
 asia           | asia_2012         | '2013-Jan-01' 
 americas       | americas_2011     | '2012-Jan-01' 
 americas       | americas_2012     | '2013-Jan-01' 
(7 rows)

需要注意的是,当添加一个新的范围子分区时,子分区规则必须指定一个范围,也就是说这个范围要在任何现有的子分区之后。

添加子分区到RANGE-LIST分区表示例

下列示例添加了一个LIST子分区到RANGE分区表sales中。 表sales是通过下列命令创建的:
CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(date)
  SUBPARTITION BY LIST (country)
  (
    PARTITION first_half_2012 VALUES LESS THAN('01-JUL-2012')
    (
      SUBPARTITION europe VALUES ('ITALY', 'FRANCE'),
      SUBPARTITION americas VALUES ('US', 'CANADA')
    ),

    PARTITION second_half_2012 VALUES LESS THAN('01-JAN-2013') 
    (
      SUBPARTITION asia VALUES ('INDIA', 'PAKISTAN')
    )
  );
在执行上述命令之后,表sales将有两个分区,分别为first_half_2012和second_half_2012。分区first_half_2012又有两个子分区,分别为europe和americas;分区second_half_2012有一个分区,名为asia。
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
  partition_name  | subpartition_name |     high_value      
------------------+-------------------+---------------------
 first_half_2012  | europe            | 'ITALY', 'FRANCE'  
 first_half_2012  | americas          | 'US', 'CANADA' 
 second_half_2012 | asia              | 'INDIA', 'PAKISTAN' 
(3 rows)
下列命令添加了一个名为east_asia的子分区到分区second_half_2012中:
ALTER TABLE sales MODIFY PARTITION second_half_2012 
  ADD SUBPARTITION east_asia VALUES ('CHINA');
在调用这个命令后,表包括了子分区east_asia:
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
  partition_name  | subpartition_name |     high_value      
------------------+-------------------+---------------------
 first_half_2012  | europe            | 'ITALY', 'FRANCE'   
 first_half_2012  | americas          | 'US', 'CANADA'     
 second_half_2012 | asia              | 'INDIA', 'PAKISTAN' 
 second_half_2012 | east_asia         | 'CHINA'        
(4 rows)