使用 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 | hash_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、RANGE 或 HASH)。新分区规则必须引用定义现有分区的分区规则中指定的列。

您可以使用 ALTER TABLE… ADD PARTITION 语句向具有 DEFAULT 规则的表添加分区,只要表中的现有行与要添加的分区的值之间没有冲突的值即可。

您不能使用 ALTER TABLE… ADD PARTITION 语句向具有 MAXVALUE 规则的表添加分区。

您也可以使用 ALTER TABLE… SPLIT PARTITION 语句拆分现有分区,有效增加表中分区的数量。

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

包括 TABLESPACE 子句来指定新分区将位于的表空间。如果您没有指定表空间,分区将位于默认表空间中。

如果为表编制了索引,将在新分区上创建索引。

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

参数

参数 说明
table_name 分区表的名称(可能是 schema 限定的)。
partition_name 要创建的分区的名称。分区名称必须在所有分区和二级分区中是唯一的,并且必须遵循对象标识符的命名约定。
subpartition_name 要创建的二级分区的名称。二级分区名称必须在所有分区和二级分区中是唯一的,并且必须遵循对象标识符的命名约定。
(value[, value]...) 使用 value 指定将行分配到分区中所依据的用引号括起来的文本值(或文本值的逗号分隔列表)。每个分区规则都必须至少指定一个 value,但对规则中指定的值的数量没有限制。value 还可能是 NULL、DEFAULT(如果指定 LIST 分区)或 MAXVALUE(如果指定 RANGE 分区)。
tablespace_name 分区或二级分区所在的表空间的名称。

示例 - 将分区添加到按列表分区的表中

以下示例将分区添加到按列表分区的 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
----------------+-------------------------------------
 EUROPE         | FOR VALUES IN ('FRANCE', 'ITALY')
 ASIA           | FOR VALUES IN ('INDIA', 'PAKISTAN')
 AMERICAS       | FOR VALUES IN ('US', 'CANADA')
(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
----------------+-------------------------------------
 EUROPE         | FOR VALUES IN ('FRANCE', 'ITALY')
 ASIA           | FOR VALUES IN ('INDIA', 'PAKISTAN')
 AMERICAS       | FOR VALUES IN ('US', 'CANADA')
 EAST_ASIA      | FOR VALUES IN ('CHINA', 'KOREA')
(4 rows)

示例 - 将分区添加到按范围分区的表中

以下示例将分区添加到名为 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
----------------+------------------------------------------------------------------
 Q1_2012        | FOR VALUES FROM (MINVALUE) TO ('01-APR-12 00:00:00')
 Q2_2012        | FOR VALUES FROM ('01-APR-12 00:00:00') TO ('01-JUL-12 00:00:00')
 Q3_2012        | FOR VALUES FROM ('01-JUL-12 00:00:00') TO ('01-OCT-12 00:00:00')
 Q4_2012        | FOR VALUES FROM ('01-OCT-12 00:00:00') TO ('01-JAN-13 00:00:00')
(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        | FOR VALUES FROM (MINVALUE) TO ('01-APR-12 00:00:00')
 Q2_2012        | FOR VALUES FROM ('01-APR-12 00:00:00') TO ('01-JUL-12 00:00:00')
 Q3_2012        | FOR VALUES FROM ('01-JUL-12 00:00:00') TO ('01-OCT-12 00:00:00')
 Q4_2012        | FOR VALUES FROM ('01-OCT-12 00:00:00') TO ('01-JAN-13 00:00:00')
 Q1_2013        | FOR VALUES FROM ('01-JAN-13 00:00:00') TO ('01-APR-13 00:00:00')
(5 rows)