ALTER TABLE…ADD SUBPARTITION命令用于添加子分区到现有的分区中,且这个分区必须已经进行了子分区的划分。
语法介绍
ALTER TABLE table_name MODIFY PARTITION partition_name
ADD SUBPARTITION subpartition_definition;
{list subpartition | range subpartition}
SUBPARTITION [subpartition_name]
VALUES (value[, value]...)
[TABLESPACE tablespace_name]
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]...) |
使用 更多关于创建 |
tablespace name | 子分区所属的表空间名称。 |
添加子分区到LIST-RANGE分区表示例
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')
)
);
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)
ALTER TABLE sales MODIFY PARTITION europe
ADD SUBPARTITION europe_2013
VALUES LESS THAN('2015-Jan-01');
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分区表示例
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')
)
);
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)
ALTER TABLE sales MODIFY PARTITION second_half_2012
ADD SUBPARTITION east_asia VALUES ('CHINA');
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)