パーティションテーブルを作成した後、そのテーブルにパーティションを追加できます。
パーティションテーブルにおけるパーティション追加操作のサポート状況
OceanBaseデータベースのMySQLモードでは、パーティションテーブルとサブパーティションテーブルにおけるパーティション追加操作の具体的なサポート状況は、次の表のとおりです。
パーティションテーブル |
パーティションタイプ |
パーティションの追加 |
サブパーティションの追加 |
|---|---|---|---|
| パーティションテーブル |
|
サポート | - |
| パーティションテーブル |
|
サポートなし | - |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポートなし | サポート |
| サブパーティションテーブル |
|
サポートなし | サポートなし |
| サブパーティションテーブル |
|
サポートなし | サポート |
| サブパーティションテーブル |
|
サポートなし | サポートなし |
パーティションの追加
パーティションテーブル、スキーマテンプレートを持つサブパーティションテーブル、およびスキーマテンプレートを持たないサブパーティションテーブルにパーティションを追加できます。
パーティションテーブルとテンプレート型サブパーティションテーブルにパーティションを追加する
パーティションテーブルとテンプレート型サブパーティションテーブルにパーティションを追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD PARTITION (partition_option);
partition_option:
{PARTITION partition_name VALUES LESS THAN range_partition_expr
[,PARTITION partition_name VALUES LESS THAN range_partition_expr]... }
|{PARTITION partition_name VALUES IN list_partition_expr
[,PARTITION partition_name VALUES IN list_partition_expr]...}
説明
Range/Range Columnsパーティションでは、最大のパーティションの後にのみパーティションを追加でき、途中や開始位置には追加できません。現在のパーティションに
MAXVALUEのパーティションが含まれている場合は、パーティションの追加を続けることはできません。List/List Columnsパーティションにパーティションを追加する場合、追加するパーティションが前のパーティションと競合しないことが条件です。List/List Columnsパーティションにデフォルトパーティション、すなわち
Default Partitionがある場合は、いかなるパーティションも追加できません。Range/Range Columns/List/List Columnsパーティションにパーティションを追加しても、グローバルインデックスとローカルインデックスの使用に影響しません。
テンプレート型サブパーティションテーブルにパーティションを追加する場合、パーティションの定義のみを指定する必要があります。対応するサブパーティションの定義は、テンプレートに従って自動的に埋め込まれます。
一部の例は以下のとおりです:
Rangeパーティションテーブル
tbl1_rを作成し、パーティションM202106を追加します。obclient> CREATE TABLE tbl1_r (id INT NOT NULL,value varchar(50),time TIMESTAMP NOT NULL) PARTITION BY RANGE(UNIX_TIMESTAMP(time)) (PARTITION M202101 VALUES LESS THAN(UNIX_TIMESTAMP('2021/02/01')), PARTITION M202102 VALUES LESS THAN(UNIX_TIMESTAMP('2021/03/01')), PARTITION M202103 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), PARTITION M202104 VALUES LESS THAN(UNIX_TIMESTAMP('2021/05/01')), PARTITION M202105 VALUES LESS THAN(UNIX_TIMESTAMP('2021/06/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_r ADD PARTITION (PARTITION M202106 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01'))); Query OK, 0 rows affectedListパーティションテーブル
tbl1_lを作成し、パーティションp2とp3を追加します。obclient> CREATE TABLE tbl1_l (col1 INT PRIMARY KEY,col2 VARCHAR(50)) PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1,2,3), PARTITION p1 VALUES IN (5,6) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_l ADD PARTITION (PARTITION p2 VALUES IN (7,8), PARTITION p3 VALUES IN (DEFAULT) ); Query OK, 0 rows affectedRange Columns + Range Columnsパーティションのテンプレート型パーティションテーブル
t_m_rcrcにパーティションp3とp4を追加します。obclient> CREATE TABLE t_m_rcrc(col1 INT,col2 INT) PARTITION BY RANGE COLUMNS(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(1000), SUBPARTITION mp1 VALUES LESS THAN(2000), SUBPARTITION mp2 VALUES LESS THAN(3000) ) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300) ); Query OK, 0 rows affected obclient> ALTER TABLE t_m_rcrc ADD PARTITION (PARTITION p3 VALUES LESS THAN(400), PARTITION p4 VALUES LESS THAN(500) ); Query OK, 0 rows affected
非テンプレート型サブパーティションテーブルにパーティションを追加する
非テンプレート型サブパーティションテーブルにパーティションを追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD PARTITION (partition_option);
partition_option:
{PARTITION partition_name VALUES LESS THAN range_partition_expr (subpartition_option)
[,PARTITION partition_name VALUES LESS THAN range_partition_expr (subpartition_option)]... }
|{PARTITION partition_name VALUES IN list_partition_expr (subpartition_option)
[,PARTITION partition_name VALUES IN list_partition_expr (subpartition_option)]...}
subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr, ...}
|{SUBPARTITION subpartition_name VALUES IN list_partition_expr, ....}
|{SUBPARTITION subpartition_name, ....}
説明
非テンプレート型サブパーティションテーブルにパーティションを追加する場合、パーティションの定義とそのパーティションに含まれるサブパーティションの定義を同時に指定する必要があります。
Range + Range型の非テンプレート型パーティションテーブルt_f_rclcにパーティションp2を追加する例を以下に示します:
obclient> CREATE TABLE t_f_rclc (col1 INT,col2 INT)
PARTITION BY RANGE COLUMNS(col1)
SUBPARTITION BY LIST COLUMNS(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES IN(1,3),
SUBPARTITION sp1 VALUES IN(4,6),
SUBPARTITION sp2 VALUES IN(7,9)),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp3 VALUES IN(1,3),
SUBPARTITION sp4 VALUES IN(4,6),
SUBPARTITION sp5 VALUES IN(7,9))
);
obclient> ALTER TABLE t_f_rclc ADD PARTITION
(PARTITION p2 VALUES LESS THAN(300)
(SUBPARTITION sp6 VALUES IN(1,3),
SUBPARTITION sp7 VALUES IN(4,6),
SUBPARTITION sp8 VALUES IN(7,9))
);
Query OK, 0 rows affected
サブパーティションの追加
注意
- HashまたはKeyタイプのサブパーティションには、新しいサブパーティションを追加できません。
- 追加するサブパーティション名は、テーブル内の既存のパーティション名やサブパーティション名と重複してはなりません。
- Rangeタイプのサブパーティションを追加する場合、Rangeの上限値は現在のパーティションの最後のサブパーティションの上限値より大きくする必要があります。複数のRangeサブパーティションを追加する場合、上限値は順次大きくなるように並べ替える必要があります。つまり、上限値が大きいRangeサブパーティションを後方に配置します。
- Listタイプのサブパーティションを追加する場合、現在のパーティション内の既存のサブパーティションの値と重複してはなりません。
- 複数のサブパーティションを追加する操作は原子的です。すべて成功するか、すべて失敗するかのどちらかです。
構文
ALTER TABLE table_name MODIFY PARTITION partition_name
ADD SUBPARTITION (subpartition_option);
subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr
[, SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr] ...}
| {SUBPARTITION subpartition_name VALUES IN list_partition_expr
[, SUBPARTITION subpartition_name VALUES IN list_partition_expr] ...}
パラメータの説明
パラメータ |
説明 |
|---|---|
| table_name | テーブル名を指定します。 |
| partition_name | 追加するサブパーティションが属するパーティション名を指定します。 |
| subpartition_name | 追加するサブパーティションの名前を指定します。 |
| subpartition_option | 新規に追加するサブパーティションの定義を表します。 |
| range_partition_expr | Range/Range Columnsパーティションの式を表します。 |
| list_partition_expr | List/List Columnsパーティションの式を表します。 |
例
Range + Rangeテンプレート分割テーブルにサブパーティションテーブルを追加します。
Range + Rangeで分割されたテンプレートのサブパーティションテーブル
tbl1_m_rrを作成します。CREATE TABLE tbl1_m_rr (col1 INT, col2 INT, col3 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE (SUBPARTITION p0 VALUES LESS THAN (1000), SUBPARTITION p1 VALUES LESS THAN (2000)) (PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200));テーブル
tbl1_m_rrのパーティションp1にサブパーティションp1sp2を追加します。ALTER TABLE tbl1_m_rr MODIFY PARTITION p1 ADD SUBPARTITION (SUBPARTITION p1sp2 VALUES LESS THAN (3000));
Range + Range非テンプレート分割テーブルにサブパーティションテーブルを追加します。
Range + Rangeで分割された非テンプレートのサブパーティションテーブル
tbl2_f_rrを作成します。CREATE TABLE tbl2_f_rr(col1 INT, col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES LESS THAN(2020), SUBPARTITION sp1 VALUES LESS THAN(2021) ), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp2 VALUES LESS THAN(2020), SUBPARTITION sp3 VALUES LESS THAN(2021), SUBPARTITION sp4 VALUES LESS THAN(2022) ) );テーブル
tbl2_f_rrのパーティションp1にサブパーティションsp5とsp6を追加します。ALTER TABLE tbl2_f_rr MODIFY PARTITION p1 ADD SUBPARTITION (SUBPARTITION sp5 VALUES LESS THAN(2023), SUBPARTITION sp6 VALUES LESS THAN(2024));