全部產品
Search
文件中心

PolarDB:ALTER TABLE… ADD SUBPARTITION

更新時間:Jul 06, 2024

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)