
# 二级分区表自动扩展
创建二级分区表时，可以在创建列表分区定义上指定AUTOMATIC关键字，以支持二级分区表的一级自动扩展/二级自动扩展。
- 创建二级分区表时，在创建一级分区定义上指定AUTOMATIC，以支持一级自动扩展。
  ```
  gaussdb=# CREATE TABLE autolist_range (c1 int, c2 int)
  PARTITION BY LIST (c1) AUTOMATIC SUBPARTITION BY RANGE (c2)
  (
      PARTITION p1 VALUES (1, 2, 3) (
          SUBPARTITION sp11 VALUES LESS THAN (5),
          SUBPARTITION sp12 VALUES LESS THAN (10)
      ),
      PARTITION p2 VALUES (4, 5, 6) (
          SUBPARTITION sp21 VALUES LESS THAN (5),
          SUBPARTITION sp22 VALUES LESS THAN (10)
      )
  );
  ```
  当插入数据无法匹配到已有的任意一级分区时，会自动创建一个新的一级分区，新一级分区的范围定义为单key（新数据对应的新分区键值），其下面会定义一个全集的二级分区。
  ```
  --一级分区键插入数据9，因为现有的一级分区p1、p2的键值中不包含9，所以自动创建一个新的一级分区sys_p1，分区定义为VALUES (9)
  gaussdb=# INSERT INTO autolist_range VALUES (9, 0);
  ```
  这一功能与如下命令等价：
  ```
  gaussdb=# ALTER TABLE autolist_range ADD PARTITION sys_p1 VALUES (9); 
  gaussdb=# INSERT INTO autolist_range VALUES (9, 0);
  gaussdb=# DROP TABLE autolist_range;
  ```
  
- 创建二级分区表时，在二级分区定义上指定AUTOMATIC，以支持二级自动扩展。
  ```
  gaussdb=# CREATE TABLE range_autolist (c1 int, c2 int)
  PARTITION BY RANGE (c1) SUBPARTITION BY LIST (c2) AUTOMATIC
  (
      PARTITION p1 VALUES LESS THAN (5) (
          SUBPARTITION sp11 VALUES (1, 2, 3),
          SUBPARTITION sp12 VALUES (4, 5, 6)
      ),
      PARTITION p2 VALUES LESS THAN (10) (
          SUBPARTITION sp21 VALUES (1, 2, 3),
          SUBPARTITION sp22 VALUES (4, 5, 6)
      )
  );
  ```
  当插入数据无法匹配到已有的任意二级分区时，会在对应的一级分区下自动创建一个新的二级分区，新二级分区的范围定义为单key（新数据对应的新分区键值）。
  ```
  --二级分区键插入数据0，因为现有的二级分区的键值中不包含0，所以自动创建一个新的二级分区sys_sp1，分区定义为VALUES (0)
  gaussdb=# INSERT INTO range_autolist VALUES (4, 0);
  ```
  这一功能与如下命令等价：
  ```
  gaussdb=# ALTER TABLE range_autolist MODIFY PARTITION p1 ADD SUBPARTITION sys_sp1 VALUES (0); 
  gaussdb=# INSERT INTO range_autolist VALUES (4, 0);
  -- 清理示例
  gaussdb=# DROP TABLE range_autolist;
  ```
  
- 创建二级分区表时，在一级/二级分区定义上同时指定AUTOMATIC，表示支持一级自动扩展/二级自动扩展。
  ```
  gaussdb=# CREATE TABLE autolist_autolist (c1 int, c2 int)
  PARTITION BY LIST (c1) AUTOMATIC SUBPARTITION BY LIST (c2) AUTOMATIC
  (
      PARTITION p1 VALUES (1, 2, 3) (
          SUBPARTITION sp11 VALUES (1, 2, 3),
          SUBPARTITION sp12 VALUES (4, 5, 6)
      ),
      PARTITION p2 VALUES (4, 5, 6) (
          SUBPARTITION sp21 VALUES (1, 2, 3),
          SUBPARTITION sp22 VALUES (4, 5, 6)
      )
  );
  ```
  - 当插入数据无法匹配到已有的任意一级分区时，会自动创建一个新的一级分区，新一级分区的范围定义为单key（新数据对应的新分区键值），其下面会定义一个范围定义为单key的二级分区。
    ```
    --一级分区键插入数据9，因为现有的一级分区p1、p2的键值中不包含9，所以自动创建一个新的一级分区sys_p1，分区定义为VALUES (9)；同时二级分区键插入数据0，因为现有的二级分区的键值中不包含0，所以会在新的一级分区sys_p1定义一个新的二级分区sys_sp1，分区定义为VALUES (0)。
    gaussdb=# INSERT INTO autolist_autolist VALUES (9, 0);
    ```
    这一功能与如下命令等价：
    ```
    gaussdb=# ALTER TABLE autolist_autolist ADD PARTITION sys_p1 VALUES (9) (SUBPARTITION sys_sp1 VALUES (0)); 
    gaussdb=# INSERT INTO autolist_autolist VALUES (9, 0);
    ```
    
  
  - 当插入数据无法匹配到已有的任意二级分区时，会在对应的一级分区下自动创建一个新的二级分区，新二级分区的范围定义为单key（新数据对应的新分区键值）。
    ```
    --二级分区键插入数据0，因为现有的二级分区的键值中不包含0，所以自动创建二级分区sys_sp2，分区定义为VALUES (0)
    gaussdb=# INSERT INTO autolist_autolist VALUES (4, 0);
    ```
    这一功能与如下命令等价：
    ```
    gaussdb=# ALTER TABLE autolist_autolist MODIFY PARTITION p2 ADD SUBPARTITION sys_sp2 VALUES (0); 
    gaussdb=# INSERT INTO autolist_autolist VALUES (4, 0);
    -- 清理示例
    gaussdb=# DROP TABLE autolist_autolist;
    ```
    
   
![](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
二级分区表的列表分区自动扩展行为受AUTOMATIC关键字的指定位置影响：
- 若在一级分区后指定了AUTOMATIC关键字，则仅支持一级分区自动扩展，不支持二级分区的自动扩展，且不能定义有一级分区键值为DEFAULT分区。
- 若在二级分区后指定了AUTOMATIC关键字，则仅支持二级分区自动扩展，不支持一级分区的自动扩展，且不能定义有二级分区键值为DEFAULT分区。

- 若在一级分区和二级分区后同时指定了AUTOMATIC关键字，则同时支持一级分区和二级分区自动扩展，一级分区键值和二级分区键值均不能定义有DEFAULT分区。
 
