ALTER TABLE... ADD PARTITION命令用于将分区添加到现有的分区表中。

语法介绍

使用ALTER TABLE. .. ADD PARTITION命令把分区添加到现有的分区表中。语法如下:
ALTER TABLE table_name ADD PARTITION partition_definition;
其中 partition_definition 是:
{list partition | range partition}
list_partition 是:
PARTITION [partition_name]
  VALUES (value[, value]...)
  [TABLESPACE tablespace_name]
  [(subpartition, ...)]
range partition 是:
PARTITION [partition_name]
  VALUES LESS THAN (value[, value]...)
  [TABLESPACE tablespace_name]
  [(subpartition, ...)]
其中 subpartition 是:
{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 PARTITION命令用于将分区添加到现有的分区表中。在分区表中对于定义的分区数量没有上限。

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

您不能使用ALTER TABLE... ADD PARTITION语句把分区添加到带有MAXVALUE或 DEFAULT规则的表中。需要注意的是,您可以交替使用ALTER TABLE. SPLIT PARTITION语句对现有分区进行划分,有效增加表中的分区数量。

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

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

如果对表进行了索引设置, 那么索引将创建在新分区上。 要使用ALTER TABLE... ADD PARTITION命令,您必须是表的拥有者或有超级用户(或管理员)的权限。

参数

参数 参数说明
table name 要创建的表名称(可以采用模式限定的方式引用)。
partition name 要创建的分区名称。分区名称在所有分区和子分区中必须是唯一的,且必须遵循给对象标识符命名的惯例。
subpartition name 要创建的子分区名称。子分区名称在所有分区和子分区中必须是唯一的,且必须遵循给对象标识符命名的惯例。
(value[, value]...) 使用value来指定一个引用的文本值(或以逗号分隔的文本值列表)将表项目划分为不同的分区。每个分区规则必须至少指定一个值,但在规则中对于指定的值的数量没有上限要求。Value可能为null default(如果指定了一个list分区的话)或 maxvalue(如果指定了一个range 分区的话)。

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

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

添加分区到LIST 分区表示例

下列示例把分区添加到列表分区表sales中。通过使用下列命令创建表:
CREATE TABLE sales
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY LIST(country)
(
  PARTITION europe VALUES('FRANCE', 'ITALY'),
  PARTITION asia VALUES('INDIA', 'PAKISTAN'),
  PARTITION americas VALUES('US', 'CANADA')
);
表包含三个分区(americas, asia 和 europe):
acctg=# SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
 partition_name |     high_value      
----------------+---------------------
 americas       | 'US', 'CANADA'      
 asia           | 'INDIA', 'PAKISTAN' 
 europe         | 'FRANCE', 'ITALY'   
(3 rows)    
下述命令用于添加分区east_asia到表sales中:
ALTER TABLE sales ADD PARTITION east_asia 
  VALUES ('CHINA', 'KOREA');
在调用这个命令之后, 表包括了east_asia分区。
acctg=# SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
 partition_name |     high_value      
----------------+---------------------
 east_asia      | 'CHINA', 'KOREA'    
 americas       | 'US', 'CANADA'      
 asia           | 'INDIA', 'PAKISTAN' 
 europe         | 'FRANCE', 'ITALY'   
(4 rows)

添加分区到RANGE 分区表示例

下列示例添加了一个分区到范围分区表sales中:

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(date)
(
  PARTITION q1_2012 
    VALUES LESS THAN('2012-Apr-01'),
  PARTITION q2_2012 
    VALUES LESS THAN('2012-Jul-01'),
  PARTITION q3_2012 
    VALUES LESS THAN('2012-Oct-01'),
  PARTITION q4_2012 
    VALUES LESS THAN('2013-Jan-01')
);
表包含四个分区(q1_2012, q2_2012, q3_2012 和 q4_2012):
acctg=# SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
 partition_name |  high_value   
----------------+---------------
 q4_2012        | '2013-Jan-01' 
 q3_2012        | '2012-Oct-01' 
 q2_2012        | '2012-Jul-01' 
 q1_2012        | '2012-Apr-01' 
(4 rows)
下列命令添加了一个名为q1_2013的分区到表sales 中:
ALTER TABLE sales ADD PARTITION q1_2013 
  VALUES LESS THAN('01-APR-2013');
在调用这个命令之后,表包括了分区q1_2013:
acctg=# SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
 partition_name |  high_value   
----------------+---------------
 q1_2012        | '2012-Apr-01' 
 q2_2012        | '2012-Jul-01' 
 q3_2012        | '2012-Oct-01' 
 q4_2012        | '2013-Jan-01' 
 q1_2013        | '01-APR-2013' 
(5 rows)