前提條件
叢集版本需為PolarDB MySQL版8.0版本且Revision version為8.0.2.2.0及以上。您可以通過查詢版本號碼確認叢集版本。
轉換規則和方法
轉換規則如下:
- 普通表可以轉換為INTERVAL RANGE分區表;INTERVAL RANGE分區表不可以轉換為普通表。您可以通過
ALTER TABLE table_name partition_options
命令來實現該轉換。 - RANGE分區表與INTERVAL RANGE分區表之間可以互轉。對於PolarDB MySQL版8.0.2.2.0及以上版本,可以通過
ALTER TABLE table_name partition_options
命令來實現該轉換;對於PolarDB MySQL版8.0.2.2.1及以上版本,可以通過ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) }
命令來實現該轉換。
文法
- 文法一:
ALTER TABLE table_name partition_options;
其中,partition_options
為:
PARTITION BY
{ RANGE{(expr) | COLUMNS(column_list)} }
{ INTERVAL(type, expr) | INTERVAL(expr) }
[(partition_definition [, partition_definition] ...)]
partition_definition
為:
PARTITION partition_name
[VALUES LESS THAN {expr | MAXVALUE}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
- 文法二:
ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };
參數
參數 | 參數說明 |
table_name | 要建立的表名稱。 |
RANGE(expr) | RANGE分區欄位運算式,目前只支援INT類型,不支援字元類型。 |
column_list | LIST COLUMNS的情況下使用,分區欄位列表,不支援運算式。 |
INTERVAL(type) | 目前支援8種時間類型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND),不顯式指定預設是數字類型的間隔。 |
INTERVAL(expr) | 指定間隔的數值大小。當type為SECOND類型時,間隔不能小於60。 |
MAXVALUE | 最大值。 |
engine_name | 儲存引擎名稱。 |
普通錶轉換為INTERVAL RANGE分區表
業務情境上,可以將一個現有的表,直接轉換成INTERVAL RANGE分區表。首先需要選取一個合適的分區鍵,並且為表裡現有的資料定義好分區,轉換完成之後,新插入的資料才可以觸發自動新增分區。
樣本:將
orders
錶轉換成INTERVAL RANGE分區表。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
);
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
RANGE分區錶轉換為INTERVAL RANGE分區表
業務情境上,可以將一個現有的RANGE分區表,轉換成INTERVAL RANGE分區表。同樣需要為表裡現有的資料定義好分區,轉換完成之後,新插入的資料才可以觸發自動新增分區。您可以通過以下兩種方式來實現轉換:
- 方式一:通過
ALTER TABLE table_name partition_options
命令實現轉換樣本:將
orders
分區錶轉換成INTERVAL RANGE分區表。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) (
PARTITION p0 VALUES LESS THAN(10000000)
);
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
- 方式二:通過
ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) }
命令實現轉換樣本:將
orders
分區錶轉換成INTERVAL RANGE分區表。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
ALTER TABLE orders SET INTERVAL(MONTH, 1);
INTERVAL RANGE分區錶轉換為RANGE分區表
業務情境上,也可以將一個現有的INTERVAL RANGE分區表,轉換成RANGE分區表。您可以通過以下兩種方式來實現轉換:
- 方式一:通過
ALTER TABLE table_name partition_options
命令實現轉換樣本:將
orders
分區錶轉換成RANGE分區表。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
- 方式二:通過
ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) }
命令實現轉換樣本:將
orders
分區錶轉換成RANGE分區表。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
ALTER TABLE orders SET INTERVAL(); /*通過不指定INTERVAL類型和值的方法就可以把INTERVAL RANGE分區錶轉換為RANGE分區表 */