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)